Android数据存储

Android系统提供了四种存储数据方式。分别为:SharePreferences、SQLite、Content Provider和File。但由于Android系统中,数据基本是私有的,都是存放于”data/data”程序包名目录下,所以要实现数据共享,正确方式是使用Content Provider

一 、SharePreferences:轻量级数据存储

SharedPreferences是一种数据存储方式,用来存储一些简单的信息,位于android.content包中,以键值对的模式进行存储,键值对(key-value)。对于存储的基本信息,如int,string,boolean,float和long。

获取方式:

  1. 使用getSharedPreferences()方法获取
  2. 使用getPreferences()方法获取

实现SharedPreferences存储步骤:

  1. 调用SharedPreferences类的edit()方法,获取SharedPreferences.Editor对象
  2. 调用一个SharedPreferences.Editor对象的putXXX()的方法获取数据
  3. 使用commit()方法提交数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class DataActivity extends AppCompatActivity {

private EditText editText;
private Button btn_save;
private Button btn_show;
private TextView textView;

private SharedPreferences sharedPreferences;//读操作
private SharedPreferences.Editor editor;//写操作

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_data);
editText=findViewById(R.id.et1);
btn_save=findViewById(R.id.btn_save);
btn_show=findViewById(R.id.btn_show);
textView=findViewById(R.id.tv1);

sharedPreferences=this.getSharedPreferences("ludainkai",MODE_PRIVATE);
editor= sharedPreferences.edit();
//读取保存
btn_save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editor.putString("tag",editText.getText().toString());
editor.commit();//或者使用apply()
}
});
//显示操作
btn_show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textView.setText(sharedPreferences.getString("tag",""));
}
});
}
}

使用SharePreferences读写数据,最终生成 的文件

目录:/data/data//shared_prefs

二、File 存储

文件存储是Android中最基本的一种存储方式,和Java中实现I/O的方式,由Context类提供openFileInput()和openFileOutput()方法打开。文件存储主要分两种存储,一种是内部存储,一种是外部存储。
内存存储(Internal Storage):使用了FileInputStream类中的openFileInput()方法,用于读取数据;使用了FileOutputStream类中的openFileOutput()方法,用于写入数据。
外部存储(External Storage):使用Enviroment类中的getExternalStorageDirectory()方法对外部存储上的文件进行读写。

简化:

  • FileOutputStream -> openFileOutput()
  • FileInputStream -> openFileInput()
  • Environment -> getExternalStorageDirectory()

一,内部存储的写入文件步骤

  1. 获取文件输出流对象 FileOutputStream
  2. 使用FileOutputStream类的openFileOutput(String name, int mode)方法
  3. 调用FileOutputStream对象的write()方法写入文件
  4. 调用flush()方法,因为write()方法是写入缓冲区的,调用flush()方法将缓冲中的数据写入到文件,清空缓存
  5. close()方法用于关闭FileOutputStream

二,内部存储的读取文件步骤

  1. 获取文件输入流对象 FileInputStream
  2. 使用FileInputStream类的openFileInput()方法来实现
  3. 调用FileInputStream对象的read()方法
  4. 调用close()关闭文件输入流对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public class FileActivity extends AppCompatActivity {
private Button btn_save;
private Button btn_show;
private TextView textView;
private EditText editText;

@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file);

editText=findViewById(R.id.et1);
btn_save=findViewById(R.id.btn_save);
btn_show=findViewById(R.id.btn_show);
textView=findViewById(R.id.tv1);
//将数据保存在文件
btn_save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String str=editText.getText().toString();
fileSave(str);
}
});
//读文件
btn_show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String str=fileRead();
textView.setText(str);
}
});

}

//封装一个方法将从控件的内容写到文件中
public void fileSave(String str){
FileOutputStream fileOutputStream=null;
try {
fileOutputStream=openFileOutput("day11.txt",MODE_PRIVATE);
fileOutputStream.write(str.getBytes());
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}

}
//封装一个方法将从文件的内容读到控件中
public String fileRead(){
FileInputStream fileInputStream=null;

try {
fileInputStream=openFileInput("day11.txt");
byte[] bytes=new byte[1024];
StringBuffer sb=new StringBuffer("");
int len=0;
while((len=fileInputStream.read(bytes))>0){
sb.append(new String(bytes,0,len));
}
return sb.toString();


} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

}

三、Sqlite 轻量级数据库,适合应用移动端数据存储

SQLite是一款轻量级的关系型数据库,它的运算很快,占用空间小,SQLite不仅有SQL语法支持,独立,还有数据库的ACID事务,SQLite数据库为一种嵌入式数据库。

SQLiteOpenHelper类,它是SQLiteDatabase的帮助类,用于管理数据库的创建和升级,SQLiteOpenHelper类为抽象类,有两个要重写的方法:onCreate()onUpgrade(),用于去实现创建和升级数据库。

在SQLiteOpenHelper类中还需要一个构造方法,这个方法接收四个参数,分别为Context contextString nameCursorFactory factoryint version这四个。第一个是参数context,第二个是数据库名,第三个是自定义Cursor,一般为null,第四个为当前的数据库版本号。

在SQLiteOpenHelper类中有两个重要的实例方法,为getReadableDatabase()getWritableDatabase()这两个方法。调用这其中的方法就能够创建数据库了。如果存在数据库就打开,没有就创建。

SQLiteOpenHelper类是一个SQLite帮助类,实现SQLite的数据操作,创建一个类去继SQLiteOpenHelper。

如何使用Sqlite数据库存储数据操作CRUD的操作

使用Sqlite的步骤:

1.编写一个类继承SQLiteOpenHelper
2.重写SQLiteOpenHelper 里面的抽象方法
3.添加构造方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class DBDataBase extends SQLiteOpenHelper {

/*@param context 上下文对象
* @param name 数据库的名称
* @param factory 游标对象
* @param version 数据库的版本
* */

//调整构造函数
public DBDataBase(Context context) {
super(context, Constant.DATABASE_NAME, null, Constant.VERSION_CODE);
}

//这个方法是创建数据库的回调方法

/**
* onCreate()方法 就是在第一次创建数据库之后的回调,
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {

Log.d("onCreate","onCreate()被执行");

//创建数据表
String sql="create table tb_user(id integer ,name varchar(20),password varchar(20),tel varchar(12))";
//创建tb_user
db.execSQL(sql);

}

//这个方法是用来升级数据库的
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d("onUpgrade","onUpgrade()被执行");
//添加表字段的sql语句
String sql="alter table tb_user add address varchar(100)";
//执行sql语句
db.execSQL(sql);

}
}

在 启动SqliteActivity时创建数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class SqliteActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite);

//创建数据
DBDataBase helper=new DBDataBase(SqliteActivity.this);
//通过helper对象创建数据
SQLiteDatabase db = helper.getWritableDatabase();

}
}

SQLiteDatabase db = helper.getWritableDatabase();
SQLiteDatabase db = helper.getReaderableDatabase();
这两种创建数据库的区别:
getReaderableDatabase()方法如果在创建数据库的时候出现异常,会返回一个可写状态的数据库,getWritableDatabase() 据库的时候出现异常 就会抛出异常

SQLite

向数据库添加数据

insert()方法,参数一表名,参数二是在未指定添加数据的情况下给某些可为空的列自动赋值为NULL,设置为null即可,参数三是ContentValues对象。

1
2
3
4
5
6
7
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name","The Book Name");
values.put("author","chen");
values.put("pages",100);
values.put("price",200);
db.insert("Book",null,values);

更新数据库中的数据

update()方法,参数一是表名,参数二是ContentValues对象,参数三、四是去约束更新某一行或某几行的数据,不指定默认更新所有。

1
2
3
4
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price",120);
db.update("Book",values,"name= ?",new String[]{"The Book Name"});

从数据库中删除数据

delete()方法,参数一是表名,参数二、三是去约束删除某一行或某几行的数据,不指定默认删除所有。

1
2
SQLiteDatabase db = helper.getWritableDatabase();
db.delete("Book","pages> ?",new String[]{"100"});

查询数据库中的数据

query()方法,参数一是表名,参数二是指定查询哪几列,默认全部,参数三、四是去约束查询某一行或某几行的数据,不指定默认查询所有,参数五是用于指定需要去group by的列,参数六是对group by的数据进一步的过滤,参数七是查询结果的排序方式

1
2
3
4
5
6
7
8
9
10
11
SQLiteDatabase db = helper.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");
int pages = cursor.getString(cursor.getColumnIndex("pages");
double price = cursor.getString(cursor.getColumnIndex("price");
}while(cursor.moveToNext());
}
cursor.close():

Cursor游标

Cursor

使用SQL语句操作数据库

1
2
3
4
5
6
7
8
9
10
//添加数据
db.execSQL("insert into Book(name,author,pages,price) values(?,?,?,?) "
,new String[]{"The Book Name","chen",100,20});
//更新数据
db.execSQL("update Book set price = ? where name = ?",new String[]
{"10","The Book Name"});
//删除数据
db.execSQL("delete from Book where pages > ?",new String[]{"100"});
//查询数据
db.execSQL("select * from Book",null);

使用事务操作

1
2
3
4
5
6
7
8
9
10
11
SQLiteDatabase db = helper.getWritableDatabase();
db.beginTransaction(); //开启事务
try{
......
db.insert("Book",null,values);
db.setTransactionSuccessful(); //事务成功执行
}catch(SQLException e){
e.printStackTrace();
}finally{
db.endTransaction(); //结束事务
}

评论