- Android系统提供了三种方式用于简单地实现数据持久化功能
- 文件存储
- SharedPreferences存储
- 数据库存储
文件存储
- 所有的数据都会原封不动的保存到文件当中,比较适合存储简单的文本数据或二进制数据
存储数据
-
Context类中有一个openFileOutput()方法,用来存储数据,这个方法接受两个参数
-
第一个参数是文件名,在文件创建的时候使用的名字
- 文件名不包括路径
- 所有的文件默认都存储在/data/data/<package name>/files/这个目录下
-
第二个参数是文件的操作模式
- MODE_PRIVATE
- 默认操作模式
- 当指定同样的文件名时,新写入的内容会覆盖原来的内容
- MODE_APPEND
- 如果文件存在了,就追加写入内容
- 文件不存在就创建新的文件
- MODE_PRIVATE
这个方法返回的是一个FileOutputStream对象,可以通过Java流的方式将数据写入到文件中
-
例子
public void save(String inputText){ FileOutputStream out = null; BufferedWriter writer = null; try{ out = openFileOutput("data",Context.MODE_PRIVATE); write = new BufferedWriter(new OutputStreamWrite(out)); write.write(inputText); } catch(IOException e){ e.printStackTrace(); } finally{ try{ if (writer != null){ writer.close() } } catch(IOException e){ e.printStackTrace(); } } }
-
读取数据
使用openFileInput()方法读取数据,这个方法只接收一个参数,就是要读取的文件名
系统会自动去默认的目录下加载要读取的文件,然后返回一个FIleInputStream对象,然后再通过Java流的方式操作
-
例子
public String load(){ FileInputStream对象 in = null; BufferedReader reader = null; StringBuilder content = new StringBuilder(); try{ // 获取一个FileInputStream对象 in = openFileInput("data"); reader = new BufferedReader(new InputStreamReader(in)); String line = " "; while ((line = reader.readLine()) != null){ content.append(line); } catch (IOException e){ e.printStackTrace(); } finally{ if (reader != null){ try{ reader.close(); }catch(IOException e){ e.printStackTrace() } } } } return content.toString(); }
SharedPreferences存储
向SharedPreferences存储数据
-
Context类中的getSharedPreferences()方法
- 这个方法接收两个参数
- 参数1:用来指定SharedPreferences文件的名称,如果指定的文件不存在就创建一个(文件都存放在/data/data/<pacakagename>/shared_prefs/目录下)
- 参数2:用于指定操作模式,只有一种模式MODE_PRIVATE,也可以直接传入0
- 在Android4.2中被废弃的模式:MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE
- 在Android6.0中被废弃的模式:MODE_MULTI_PROCESS
-
Activity类中的getSharedPreferences()方法
- 和上面的方法相似,但是只接收一个参数
- 参数:操作模式
- 使用这个方法的时候会自动将当前活动的类名作为SharedPreferences的文件名
-
PreferenceManager类中的getDefaultSharedPreferences()方法
- 静态方法,接收一个Context参数,自动使用当前应用程序的包名作为前缀名来命名SharedPreferences文件
- 存储数据分为三步
- 调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象
- 向SharedPreferences.Editor对象中添加数据
- 调用apply()方法将添加的数据提交即可
-
例子
public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button saveData = (Button)findViewById(R.id.save_data); saveData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit(); editor.putString("name","Tom"); editor.putInt("age",28); editor.putBoolean("married",false); editor.apply(); } }); } }
- 通过getSharedPreferences()方法指定SharedPreferences的文件名叫data
从SharedPreferences读取数据
SharedPreferences对象中提供了一系列的get方法来读取数据,get方法对应put方法(putString对应getString)
-
这些get方法接收两个参数
- 参数1:键,传入存储数据时使用的键
- 参数2:默认值,当传入的键找不到对应的值的时候以默认的值进行返回
-
例子
public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button readData = (Button) findViewById(R.id.read_data); readData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { 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); } }); } }
SQLite数据库
创建数据库
借助SQLiteOpenHelper类来操作数据库
SQLiteOpenHelper类是一个抽象类,必须自己写一个类来继承它,自己写的类必须重写其中的onCreate()方法和onUpgrade()方法
-
SQLiteOpenHelper类中的两个重要的方法getReadableDatabase()和getWritableDtatabase()
- 这两个方法都可以创建或打开一个数据库(数据库存在就打开,不存在就创建),返回返回一个可以对数据库进行读写操作的对象
- 当数据库不能写入的时候,getReadableDatabase()方法返回的对象只能以只读的方式打开数据库,getWritableDtatabase()方法会出现异常
-
SQLiteOpenHelper类有两个构造方法,构造方法有四个参数
- 参数1:Context,必须有它才能操作数据库
- 参数2:数据库名字,创建数据库的时候使用这个名字
- 参数3:查询数据的时候返回一个自定义的Cursor,可以传入null
- 参数4:数据库的版本号
数据库文件存放在/data/data/<package_name>/databases/这个目录下
-
例子
-
创建一个MyDatabaseHelper类继承SQLiteOpenHelper类
public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table Book(" + "id integer primary key autoincrement," + "author text," + "price real," + "pages integer," + "name text)"; private Context mContext; public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); mContext = context; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK); Toast.makeText(mContext, "创建成功", Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
- 定义一个类,然后在类中写一个创建数据库的语句
- 重写onCreate()方法,在这个方法中调用刚才写的语句
-
然后创建数据库
public class MainActivity extends AppCompatActivity{ private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,1); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dbHelper.getWritableDatabase(); } }); } }
-
升级数据库
使用onUpgrade()方法来升级数据库
-
例子
public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table Book(" + "id integer primary key autoincrement," + "author text," + "price real," + "pages integer," + "name text)"; private Context mContext; public static final String CREATE_CATEGORY = "create table Category(" + "id integer primary key autoincrement," +"category name text," +"category code integer)"; public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); mContext = context; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_BOOK); db.execSQL(CREATE_CATEGORY); Toast.makeText(mContext, "创建成功", Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 当表Book和Category存在的时候就删除 db.execSQL("drop table if exists Book"); db.execSQL("drop table if exists Category"); onCreate(db); } }
-
要执行onUpgrade()方法,只需要在SQLiteOpenHelper的构造方法中,修改第四个参数就可以
public class MainActivity extends AppCompatActivity{ private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 因为之前第四个参数的值是1,这里只要比1大就行 dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,2); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dbHelper.getWritableDatabase(); } }); } }
添加数据
SQLiteDatabae中提供了一个insert()方法来添加数据
-
insert(table_name,null,ContentValues)
- 参数1:表名
- 参数2:在未指定添加数据的情况下给某些可以为空的列自动赋值NULL,可以直接写null
- 参数3:ContentValues对象,这个对象提供了一系列的put()方法,将表中每个列名以及相应的待添加数据传入就行了
-
例子
public class MainActivity extends AppCompatActivity{ private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,1); Button addData = (Button) findViewById(R.id.add_data); addData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); // 下面的代码用来组装一条要插入数据库中的数据 values.put("name","A Book"); // put()第一个参数是表中的列名,第二个是要插入的值 values.put("author","Jone Doe"); values.put("pages",444); values.put("price",55.45); // 将组装好的数据插入到数据库中 db.insert("Book",null,values); values.clear(); } }); } }
更新数据
SQLiteDatabae中提供了一个update()方法来添加数据
-
update(table_name,ContentValues,args,args)
- 参数1:表名
- 参数2:ContentValues对象,更新的数据在这里完成组装
- 参数3和4用于约束更新的范围,是哪一行还是哪几行,不指定就默认更新所有行
-
例子
public class MainActivity extends AppCompatActivity{ private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,1); Button updateData = (Button) findViewById(R.id.update_data); updateData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("price",56.78); // 参数3相当于SQL语句中的where部分 // 这里表示更新所有name等于?的行,?在这里表示占位符,具体的值通过参数4提供 // 参数4提供了一个字符串数据,来给参数3中的占位符指定相应的内容 db.update("Book",values,"name=?",new String[]{"A Book"}); } }); } }
删除数据
SQLiteDatabae中提供了一个delete()方法来添加数据
-
delete(table_name,args,args)
- 参数1:表名
- 参数2和参数3:用于约束删除哪一行或者哪几行的数据,不指定就默认删除所有行
-
例子
public class MainActivity extends AppCompatActivity{ private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,1); Button deleteButton = (Button) findViewById(R.id.delete_data); deleteButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SQLiteDatabase db = dbHelper.getWritableDatabase(); // 这里表示删除页数超过300的数据 db.delete("Book","pages > ?",new String[]{"300"}); } }); } }
查询数据
SQLiteDatabae中提供了一个query()方法来添加数据
调用query()方法之后会返回一个Cursor对象,查询到的数据都从这个对象中取出
-
query()方法有7个参数
- 参数1:表名
- 参数2:指定去查询哪几列,不指定就默认查询所有列
- 参数3,参数4:用于约束查询某一行或某几行的数据,不指定就默认查询所有行的数据
- 参数5:用于指定需要去group by的列,不指定就表示不对查询结果进行group by的操作
- 参数6:用于对group by之后的数据进行进一步过滤,不指定就不进行过滤
- 参数7:指定查询结果的排序方式,不指定就表示使用默认的排序方式
-
例子
public class MainActivity extends AppCompatActivity{ private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,1); Button queryButton = (Button) findViewById(R.id.retrieve_data); queryButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SQLiteDatabase db = dbHelper.getWritableDatabase(); // 查询表中所有的数据 Cursor cursor = db.query("book",null,null,null,null,null,null); if (cursor.moveToFirst()){ do { String name = cursor.getString(cursor.getColumnIndex("name")); String author = cursor.getString(cursor.getColumnIndex("author")); }while (cursor.moveToNext()); } cursor.close(); } }); } }