一、文件存储
不对存储内容进行任何格式化处理,原封不动存储到文件中,适合于存储简单文本数据或二进制数据。
1、存储5部曲:
- 获取FileOutputStream对象,该对象通过Context类提供的openFileOutput()方法获取
- 获取OutputStreamWriter对象,传入参数为上面获取的FileOutputStream对象
- 获取BufferedWriter对象,该对象传入参数为上面获取的OutputStreamWriter对象
- 用BufferedWriter对象的write()方法将数据写入
- 关闭BufferedWriter对象
public void save(String inputText) {
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2、读取5部曲
- 获取FileInputStream对象
- 获取InputStreamReader对象,需要传入上面获取的FileInputStream对象
- 获取BufferedReader对象,需要传入上面的InputStreamReader对象;
- 用readLine()读取
- 关闭BufferedReader对象
public String load() {
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
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采用键值对方式存储数据
1、存储4部曲
- 获取SharedPreferences对象 三种方法
1.1 Context类中getSharedPreferences()方法,两个参数,名称和操作模式
1.2 Activity类中getPreferences()方法:一个参数,操作模式
1.3 PreferenceManager类中getDefaultSharedPreferences()方法:一个参数context参数 - 调用SharedPreferences对象的edit()方法获取SharedPreferences.Editor对象
- 向SharedPreferences.Editor对象中添加数据,putString()、putBoolean()等
- 调用commit()写入数据
2、读取2部曲
- 获取SharedPreferences对象
- 利用getString()、getInt()等获取数据。传入两个参数,一是key,二是默认值,即如果找不到该key,则返回该默认值。
saveData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 1 文件名为 data.xml
// SharedPreferences pref = getSharedPreferences("data", Context.MODE_PRIVATE);
// 2 文件名为 MainActivity.xml
// SharedPreferences pref = getPreferences(Context.MODE_PRIVATE);
// 3文件名为 包名.xml
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor editor = pref.edit();
editor.putString("name", "Tom");
editor.putInt("age", 28);
editor.putBoolean("married", false);
editor.apply();
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数据库
1、创建数据库
首先,建立自己的public class MyDatabaseHelper extents SQLiteOpenHelper{}
SQLiteOpenHelper类为抽象类,需要重写两个抽象方法:onCreate()和onUpdate()
还要重写构造方法。参数最少的构造方法有四个参数:Context、database_name、Cursor(一般写null、vision版本号)。
然后,建立MyDatabaseHelper的对象,调用其getReadableDatabase()或 getWritableDatabase()方法。
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,
CursorFactory factory, int version) {
super(context, name, factory, version);
mcontext=context;
}
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
在MainActivity中调用,
databaseHelper = new MyDatabaseHelper(this, "BookStore", null, 1);
databaseHelper.getWritableDatabase();
此时,创建了一个名为BookStore,版本为1的数据库。并且,调用了onCreate()方法,建立了一个名为Book的表。
2、升级数据库
Tips
(1)当相同版本的数据库BookStore已经存在了,则MyDatabaseHelper中的onCreate()方法就不会执行了。
(2)如果创建表时发现该表已经存在,则会直接报错,所以需要将已经存在的表删除。
(3)只有当版本号比原来高,onUpdate()方法才会执行。
databaseHelper = new MyDatabaseHelper(this, "BookStore", null, 2);
添加一张表进去,并提高数据库版本
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mcontext, "创建成功", Toast.LENGTH_SHORT).show();
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
缺点:需要删除已经存在的表,以前的数据也会被删除。
3、添加数据
4、更新数据
5、删除数据
6、查询数据
7、直接使用SQL操作数据库
四、数据库最佳实践
1、使用事务
首先,开启事务:db.beginTransaction();
然后,执行数据库操作;
最后,事务成功:db.setTransactionSuccessful();
2、升级数据库最佳写法
之前升级数据库时,为了确保新增加的table之前没有,就先把table全部删除了,这样的行为是很不合常理的。
改进方法为:
改变version,然后在onUpdate()中进行判断,根据version执行不同的更新操作。
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion) {
case 1:
db.execSQL(CREATE_CATEGORY);
case 2:
db.execSQL("alter table Book add column category_id integer");
default:
}
}
版本 | 数据库的改动情况 |
---|---|
version=1 | 建数据库,添加table Book $1600 |
version=2 | 添加table Category |
version=3 | 在table Book中添加category_id |
如果是第一次安装,则直接进入onCreate(),直接安装最新版本;
如果第一次安装版本1,则进入onUpdate(),连续进行了两次升级;
如果第一次安装版本2,则进入onUpdate(),只进行了最后一次升级。