数据存储

一、SharedPreferences 对象

1、SharedPreferences 是使用键值对的方式来存储数据的。而且还支持多种不同的数据类型存储,如果存储的数据类型是整型,那么读取出来的数据也是整型的,存储的数据是一个字符串,读取出来的数据仍然是字符串。

2、如何得到SharedPreferences对象:

  1. Context类中的getSharedPreferences(),接收两个参数,一个参数用于指定SharedPreferences 文件的名称,第二个参数用于指定操作模式,MODE_PRIVATE(只有当前的应用程序才可以对这个文件进行读写)、MODE_MULTI_PROCESS(一般用于多个进程中对同一个文件进行读写)。
  2. Activity中的getPreferences()方法,只接收一个操作模式参数,使用这个方法时会自动将当前活动的类名作为SharedPreferences 的文件名。
  3. PreferenceManager 类中的getDefaultSharedPreferences()方法。这是一个静态方法,它接收一个Context 参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences 文件

3、使用SharedPreferences写数据

     saveData.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                //1. 调用SharedPreferences 对象的edit()方法来获取一个SharedPreferences.Editor 对象。
                SharedPreferences.Editor editor=getSharedPreferences("data", MODE_PRIVATE).edit();
                //2. 向SharedPreferences.Editor 对象中添加数据,
                editor.putString("name", "Tom");
                editor.putInt("age", 26);
                editor.putBoolean("married", false);
                //3. 调用commit()方法将添加的数据提交,
                editor.commit();
            }
        });

 4、使用SharedPreferences读数据

      restoreData.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                SharedPreferences pref=getSharedPreferences("data",MODE_PRIVATE);
                //第一个参数是键,第二个参数是默认值
                String name=pref.getString("name", "");
                int age=pref.getInt("age", 0);
                boolean married=pref.getBoolean("married", false);
                Log.d("MainActivity", "name is "+name);
                Log.d("MainActivity", "age is "+age);
                Log.d("MainActivity", "married is "+married);
            }
        });

 二、SQLite数据库存储

SQLiteOpenHelper 是一个抽象类,这意味着如果我们想要使用它的话,就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper 中有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。
SQLiteOpenHelper 中还有两个非常重要的实例方法, getReadableDatabase() 和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在
则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。

SQLiteOpenHelper 中有两个构造方法可供重写,一般使用参数少一点的那个构造方法即可。这个构造方法中接收四个参数,

  • 第一个参数是Context,这个没什么好说的,必须要有它才能对数据库进行操作。
  • 第二个参数是数据库名,创建数据库时使用的就是这里指定的名称。
  • 第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null。
  • 第四个参数表示当前数据库的版本号, 可用于对数据库进行升级操作

创建自己的MyDatabaseHelper

package com.example.sqlitepratice;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

public class MyDatabaseHelper extends SQLiteOpenHelper{
    
    
    public MyDatabaseHelper(Context context, String name,
            CursorFactory factory, int version) {
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
        mContext=context;
    }

    public static final String CREATE_BOOK="create table Book("
            +"id integer primary key autoincrement, "
            +"author text,"
            +"price real,"
            +"pages integer,"
            +"name text)";
    
    public static final String CREATE_CATEGORY="create table Category("
                    +"id integer primary key autoincrement,"
                    +"category_name text,"
                    +"category_code integer);";
    private Context mContext;
    
    
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(CREATE_BOOK);//执行这条语句
        db.execSQL(CREATE_CATEGORY);
        Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
        // TODO Auto-generated method stub
        db.execSQL("drop table if exists Book");
        db.execSQL("drop table if exists Category");
        onCreate(db);
    }

}

注意点:

升级数据库的时候,SQLiteOpenHelper 的构造方法里接收的第四个参数,它表示当前数据库的版本号,之前我们传入的是1,现在只要传入一个比1 大的数,就可以让onUpgrade()方法得到执行了

        //查询数据
        queryData.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                SQLiteDatabase db=dbHelper.getReadableDatabase();
                Cursor cursor=db.query("Book", null, null, null, null, null, null);
                if(cursor.moveToFirst()){
                    do{
                        String name=cursor.getString(cursor.getColumnIndex("name"));
                        Log.d("MainActivity", "name is "+name);
                    }while(cursor.moveToNext());
                }
            }
        });
        //删除数据
        deleteData.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                SQLiteDatabase db=dbHelper.getWritableDatabase();
                db.delete("Book", "price>?", new String[]{"500"});
            }
        });
        //插入数据
        insertData.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                SQLiteDatabase db=dbHelper.getWritableDatabase();
                ContentValues values=new ContentValues();
                values.put("price",563);
                db.update("Book", values, "name=?",new String[]{"Tom"});
                
            }
        });
        //添加数据
        addData.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                SQLiteDatabase db=dbHelper.getWritableDatabase();
                ContentValues values=new ContentValues();
                values.put("name", "Tom");
                values.put("author", "Dan Brown");
                values.put("pages", 123);
                values.put("price", 12.36);
                db.insert("Book", null, values);
                
            }
        });

使用事务

   replaceData.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                SQLiteDatabase db=dbHelper.getReadableDatabase();
                db.beginTransaction();
                try {
                    db.delete("Book", null, null);
                    if(true){
                        throw new NullPointerException();
                    }
                    ContentValues values=new ContentValues();
                    values.put("name", "Java for Java");
                    values.put("author","Joe");
                    db.insertOrThrow("Book", null, values);
                    db.setTransactionSuccessful();
                } catch (Exception e) {
                    // TODO: handle exception
                }finally{
                    db.endTransaction();
                }
            }
        });
        
原文地址:https://www.cnblogs.com/lyjs/p/5282463.html