一、SharedPreferences 对象
1、SharedPreferences 是使用键值对的方式来存储数据的。而且还支持多种不同的数据类型存储,如果存储的数据类型是整型,那么读取出来的数据也是整型的,存储的数据是一个字符串,读取出来的数据仍然是字符串。
2、如何得到SharedPreferences对象:
- Context类中的getSharedPreferences(),接收两个参数,一个参数用于指定SharedPreferences 文件的名称,第二个参数用于指定操作模式,MODE_PRIVATE(只有当前的应用程序才可以对这个文件进行读写)、MODE_MULTI_PROCESS(一般用于多个进程中对同一个文件进行读写)。
- Activity中的getPreferences()方法,只接收一个操作模式参数,使用这个方法时会自动将当前活动的类名作为SharedPreferences 的文件名。
- 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(); } } });