一、文件存储
写入文件
- openFileOutput将数据存储到指定的文件当中去。第一个是文件名,第二个是文件的操作模式,MODE_PRIVATE为默认,会覆盖之前内容,MODE_APPEND会追加内容。默认存储到/data/data/pacak name/file下
- 获得FileOutputStream对象,借助他构建OutputStreamWriter对象,在构建BufferedWriter对象,使用Java流方式将其写到文件当中去。
- 输入结束关闭输入流。
public void save() {
String data = "Data to save";
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(data);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace()
}
}
}
读取文件
- openFileInput获得FileInputStream对象;
- 借助上一步结果构建InputStreamReader对象,在构建BufferedReader对象,再一行行构读取文本中的所有内容,存放至Stringbuilder对象中去。读取并返回,关闭Reader流。
- 关闭输入流。
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中
- 使用三种方法获得SharedPreferences对象,
- 第一种是Context 类中的 getSharedPreferences()方法,参数是文件名和指定的操作模式;
- 第二种Activity 类中的getPreferences(),只有一个参数操作模式;自动将当前活动的类名作为 SharedPreferences 的文件名。
- 第三种是PreferenceManager 类中的 getDefaultSharedPreferences()方法
这是一个静态方法,它接收一个 Context 参数,并自动使用当前应用程序的包名作为前缀来命名。
- SharedPreferences的edit方法获取editor对象。
- 在Editor对象中添加数据,比如添加布尔类型putBoolean,添加字符串putString
- 将添加的数据进行提交commit()。
SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.putString("name", "Tom");
editor.putInt("age", 28);
editor.putBoolean("married", false);
editor.commit();
从 SharedPreferences 中读取数据
- getSharedPreferences获得sharedPreferences对象;
- etString、getInt获得相应数值,若没有,则用后面的默认值替代.
SharedPreferences pref = getSharedPreferences("data",
MODE_PRIVATE);
String name = pref.getString("name", "");
三、SQLite
轻量级关系型数据库,速度快,占用资源少,遵循数据库ACID事务。
创建数据库
- 创建MyDatabaseHelper继承自SQLiteHelper,创建数据库的语句,将建表语句定义成字符串常量。
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)";
}
- 在onCreate调用SQLiteDatabase的execSQL执行这条建表语句.
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
}
升级数据库
在Book表基础之上再添加Category表;如果在oncreate()方法直接添加,会因为Book表已经存在而错误。
- 在onUpgrade中增加两条Drop语句,若存在则删除该表,并转而执行onCreate方法;
- 在onCreate方法中执行创表语句;
- dbHelper = new
MyDatabaseHelper(this,“BookStore.db”,null,2);将版本号改为比1大的。就能够触发oncreate()方法。
数据库操作
- 添加数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
// 开始组装第一条数据
values.put("name", "The Da Vinci Code");
values.put("author", "Dan Brown");
values.put("pages", 454);
values.put("price", 16.96);
db.insert("Book", null, values); // 插入第一条数据
第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值 NULL
- 更新数据
SQLiteDatabase db=dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price",10.99);
db.update("Book",values,"name=?",new String[]{"The Da Vinci Code"});
第三个参数对应SQL语句的where部分,表明更新所有name等于?的行,而?相当于一个占位符,第四个参数为占位符指定的内容。
- 删除数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book","pages>?",new String[]{"500"});
- 查询数据
较为复杂,总共七个参数
query()方法参数 | 对应 SQL 部分 | 描述 |
---|---|---|
table | from table_name | 指定查询的表名 |
columns | select column1, column2 | 指定查询的列名 |
selection | where column = value | 指定 where 的约束条件 |
selectionArgs | - | 为 where 中的占位符提供具体的值 |
groupBy | group by column | 指定需要 group by 的列 |
having | having column = value | 对 group by 后的结果进一步约束 |
orderBy | order by column1, column2 | 指定查询结果的排序方式 |
- db.query(“Book”,null…)查询Book表中的所有数据,并将数据以Cursor对象进行返回。
- 将数组指针通过moveToFirst移到第一行的位置。
- 遍历Cursor对象,取出数据并打印,通过getColumnIndex获取某一列在表中对应的位置索引,然后将这索引传入到相应的取值方法中,这样便可以得到从数据库中读取到的数据了。
- Log输出。moveToNext获取下一条数据。
- 调用Close方法来关闭Cursor流。
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 查询Book表中所有的数据
Cursor cursor = db.query("Book", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
// 遍历Cursor对象,取出数据并打印
String name = cursor.getString(cursor. getColumnIndex("name"));
String author = cursor.getString(cursor. getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.
getColumnIndex("price"));
Log.d("MainActivity", "book name is " + name);
Log.d("MainActivity", "book author is " + author);
Log.d("MainActivity", "book pages is " + pages);
Log.d("MainActivity", "book price is " + price);
} while (cursor.moveToNext());
}
cursor.close();