目录
- Android数据存储几种方式
- 一、共享参数
- 二、数据库SQLite
- 1、数据定义语言(DDL)
- (1)创建表格
- (2)删除表格
- (3)修改表结构
- 2、数据操纵语言(DML)
- (1)添加记录
- (2)删除记录
- (3)修改记录
- (4)查询记录
- 三、数据库管理器SQLiteDatabase
- 管理类
- 事务类
- 数据处理类
- 四、数据库帮助器SQLiteOpenHelper
Android数据存储几种方式
- SharePreferences
- 数据库SQLite
- 存储卡的文件操作
- Application
一、共享参数
SharePreferences是Android的一个轻量级存储工具,采用的存储结构是Key-Value的键值对方式。
共享参数的存储介质是符合XML规范的配置文件,保存路径是:/data/data/应用包名/shared_prefs/文件名.xml
使用场景
共享参数主要适用于如下场合:
- 简单且孤立的数据,若是复杂且相互间有关的数据,则要保存在数据库中。
- 文本形式的数据,若是二进制数据,则要保存在文件中。
- 需要持久化存储的数据,在APP退出后再次启动时,之前保存的数据仍然有效。
实际开发,共享参数经常存储的数据有APP的个性化配置信息、用户使用APP的行为信息、临时需要保存的片段信息等。
例:输入姓名保存到共享参数,重新打开应用会自动输入到输入框。
XML文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
android:layout_width="match_parent" | |
android:layout_height="match_parent" | |
android:orientation="vertical" | |
android:padding="5dp"> | |
<LinearLayout | |
android:layout_width="match_parent" | |
android:layout_height="40dp" | |
android:orientation="horizontal"> | |
<TextView | |
android:id="@+id/tv_name" | |
android:layout_width="wrap_content" | |
android:layout_height="match_parent" | |
android:gravity="center" | |
android:text="姓名" | |
android:textSize="17sp"/> | |
<EditText | |
android:id="@+id/et_name" | |
android:layout_width="0dp" | |
android:layout_height="match_parent" | |
android:layout_weight="1" | |
android:hint="请输入姓名" | |
android:inputType="text" | |
android:textSize="17sp"/> | |
</LinearLayout> | |
<Button | |
android:id="@+id/btn_save" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
android:text="保存到共享参数" | |
android:textSize="17sp"/> | |
</LinearLayout> |
java文件
public class ShareWriteActivity extends AppCompatActivity implements View.OnClickListener { | |
private EditText et_name; | |
private SharedPreferences preferences; | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_share_write); | |
et_name = findViewById(R.id.et_name); | |
findViewById(R.id.btn_save).setOnClickListener(this); | |
// 点击保存共享参数则保存数据 | |
preferences = getSharedPreferences("config", Context.MODE_PRIVATE); | |
// 打开应用会检测是否有保存过的数据 | |
reload(); | |
} | |
private void reload() { | |
String name = preferences.getString("name",null); | |
if(name != null){ | |
et_name.setText(name); | |
} | |
} | |
public void onClick(View view) { | |
String name = et_name.getText().toString(); | |
SharedPreferences.Editor editor = preferences.edit(); | |
editor.putString("name",name); | |
editor.commit(); | |
} | |
} |
二、数据库SQLite
SQLite是一种小巧的嵌入式数据库,使用方便、开发简单,由于属于轻型数据库,不涉及复杂的数据控制操作,因此App开发只用到数据定义和数据操纵两类SQL。
1、数据定义语言(DDL)
它描述了怎样变更数据实体的框架结构,主要包括三种操作:创建表格、删除表格、修改表结构。
(1)创建表格
语法:CREATE TABLE IF NOT EXISTS 表格名称();
说明:
- SQL语句不区分大小写。
- 支持整型INTEGER,长整型LONG,字符串VARCHAR,浮点数FLOAT,但不支持布尔类型,如果使用布尔类型,true转换为1,false转换为0。
- 为避免重复建表,应加上IF NOT EXISTS关键词。
- 建表时需要唯一标识字段,它的字段名为id。
例:
CREATE TABLE IF NOT EXISTS user_info( | |
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, | |
name VARCHAR NOT NULL | |
); |
(2)删除表格
语法:DROP TABLE IF EXISTS 表格名称;
例:
DROP TABLE IF EXISTS user_info;
(3)修改表结构
语法:ALTER TABLE 表格名称 修改操作;
说明:
SQLite只支持增加字段,不支持修改字段,也不支持删除字段,对于字段增加操作,需要在alter之后补充add命令。
例:
ALTER TABLE user_info ADD COLUMN phone VARCHAR;
2、数据操纵语言(DML)
描述了怎么样处理数据实体的内部记录,表格记录的操作类型包括添加、删除、修改、查询四类。
(1)添加记录
语法:INSERT INTO 表格名称( 以逗号分隔的字段名列表 ) VALUES (以逗号分隔的字段值列表);
例:
INSERT INTO user_info (name,age,height) VALUES ('张',20,64);
(2)删除记录
语法:DELETE FROM 表格名称 WHERE 查询条件;
例:
DELETE FROM user_info WHERE name = '张';
(3)修改记录
语法:UPDATE 表格名称 SET 字段名=字段值 WHERE 查询条件;
例:
UPDATE user_info SET married=1 WHERE name='张';
(4)查询记录
语法:SELECT 以逗号分隔的字段名列表 FROM 表格名称 WHERE 查询条件;
例:
SELECT name FROM user_info WHERE name='张';
查询操作除了比较字段值条件外,还可对查询结果排序“ORDER BY 字段名 ASC或DESC”
例:
SELECT * FROM user_info ORDER BY age ASC;
三、数据库管理器SQLiteDatabase
若要在java代码中操纵SQLite,需专门的工具类,SQLiteDatabase是Android提供的SQLite数据库管理器,可调用openOrCreateDatabase方法获取数据库实例。
获取数据库实例后,可开展各项操作,提供了若干操作数据表的API,常用方法:
管理类
用于数据库 层面的操作
- openDatabase:打开指定路径的数据库。
- isOpen:判断数据库是否已打开。
- close:关闭数据库。
- getVersion:获取数据库的版本号。
- setVersion:设置数据库的版本号。
事务类
- 用于事务层面的操作 beginTransaction:开始事务。
- setTransactionSuccessful:设置事务的成功标志。
- endTransaction:结束事务。
数据处理类
用于数据表层面的操作
- execSQL:执行拼接好的SQL控制语句。
- delete:删除符合条件的记录。
- update:更新符合条件的记录。
- insert:插入一条记录。
- query:执行查询操作,返回结果集的游标。
- rawQuery:执行拼接好的SQL查询语句,返回结果集的游标。
例:创建、删除数据库
XML文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
android:layout_width="match_parent" | |
android:layout_height="match_parent" | |
android:orientation="vertical"> | |
<LinearLayout | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
android:orientation="horizontal"> | |
<Button | |
android:id="@+id/btn_database_create" | |
android:layout_width="0dp" | |
android:layout_height="wrap_content" | |
android:layout_weight="1" | |
android:text="创建数据库" | |
android:textSize="17sp"/> | |
<Button | |
android:id="@+id/btn_database_delete" | |
android:layout_width="0dp" | |
android:layout_height="wrap_content" | |
android:layout_weight="1" | |
android:text="删除数据库" | |
android:textSize="17sp"/> | |
</LinearLayout> | |
<TextView | |
android:id="@+id/tv_database" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
android:textSize="17sp"/> | |
</LinearLayout> |
java代码
public class DatabaseActivity extends AppCompatActivity implements View.OnClickListener { | |
private TextView tv_database; | |
private String mDatabaseName; | |
private String desc; | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_database); | |
tv_database = findViewById(R.id.tv_database); | |
findViewById(R.id.btn_database_create).setOnClickListener(this); | |
findViewById(R.id.btn_database_delete).setOnClickListener(this); | |
// 生成一个测试数据库的完整路径 | |
mDatabaseName = getFilesDir() + "/test.db"; | |
} | |
public void onClick(View view) { | |
switch (view.getId()){ | |
// 创建或打开数据库,数据库如果不存在则创建 | |
case R.id.btn_database_create: | |
SQLiteDatabase db = openOrCreateDatabase(mDatabaseName, Context.MODE_PRIVATE,null); | |
desc = String.format("数据库%s创建%s",db.getPath(),(db != null) ? "成功":"失败"); | |
tv_database.setText(desc); | |
break; | |
case R.id.btn_database_delete: | |
//删除数据库 | |
boolean result = deleteDatabase(mDatabaseName); | |
desc = String.format("数据库%s删除%s",mDatabaseName,result? "成功":"失败"); | |
tv_database.setText(desc); | |
break; | |
} | |
} | |
} |
四、数据库帮助器SQLiteOpenHelper
SQLiteOpenHelper是Android提供的数据库辅助工具,用于指导开发者进行SQLite的合理使用。
使用步骤:
- 新建继承SQLiteOpenHelper的数据库操作类,提示重写onCreate和onUpgrade两个方法。
- 封装保证数据库安全的必要方法。
- 提供对表记录进行增加、删除、修改、查询的操作方法。
例:添加到数据库中
创建database包,包下创建java类
public class UserDBHelper extends SQLiteOpenHelper { | |
private static final String DB_NAME = "user.db"; | |
private static final String TABLE_NAME = "user_info"; | |
private static final int DB_VERSION = 1; | |
private static UserDBHelper mHelper = null; | |
private SQLiteDatabase mRDB = null; | |
private SQLiteDatabase mWDB = null; | |
private UserDBHelper(Context context){ | |
super(context,DB_NAME,null,DB_VERSION); | |
} | |
// 利用单例模式获取数据库帮助器的唯一实例 | |
public static UserDBHelper getInstance(Context context){ | |
if(mHelper == null){ | |
mHelper = new UserDBHelper(context); | |
} | |
return mHelper; | |
} | |
// 打开数据库的读连接 | |
public SQLiteDatabase openReadLink(){ | |
if(mRDB == null || !mRDB.isOpen()){ | |
mRDB = mHelper.getReadableDatabase(); | |
} | |
return mRDB; | |
} | |
// 打开写连接 | |
public SQLiteDatabase openWriteLink(){ | |
if(mWDB == null || !mWDB.isOpen()){ | |
mWDB = mHelper.getWritableDatabase(); | |
} | |
return mWDB; | |
} | |
// 关闭数据库连接 | |
public void closeLink(){ | |
if(mRDB != null && mRDB.isOpen()){ | |
mRDB.close(); | |
mRDB = null; | |
} | |
if(mWDB != null && mWDB.isOpen()){ | |
mWDB.close(); | |
mWDB = null; | |
} | |
} | |
// 创建数据库,执行建表语句 | |
public void onCreate(SQLiteDatabase db) { | |
String sql = "CREATE TABLE IF NOT EXISTS "+TABLE_NAME+"(" + | |
"id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + | |
"name VARCHAR NOT NULL);"; | |
db.execSQL(sql); | |
} | |
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { | |
} | |
public long insert(User user){ | |
ContentValues values = new ContentValues(); | |
values.put("name",user.name); | |
return mWDB.insert(TABLE_NAME,null,values); | |
} | |
} |
XML文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
android:layout_width="match_parent" | |
android:layout_height="match_parent" | |
android:orientation="vertical" | |
android:padding="5dp"> | |
<LinearLayout | |
android:layout_width="match_parent" | |
android:layout_height="40dp" | |
android:orientation="horizontal"> | |
<TextView | |
android:id="@+id/tv_name" | |
android:layout_width="wrap_content" | |
android:layout_height="match_parent" | |
android:gravity="center" | |
android:text="姓名" | |
android:textSize="17sp"/> | |
<EditText | |
android:id="@+id/et_name" | |
android:layout_width="0dp" | |
android:layout_height="match_parent" | |
android:layout_weight="1" | |
android:hint="请输入姓名" | |
android:inputType="text" | |
android:textSize="17sp"/> | |
</LinearLayout> | |
<Button | |
android:id="@+id/btn_add" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
android:text="添加" | |
android:textSize="17sp"/> | |
</LinearLayout> |
Userjava类
public class User { | |
public int id; | |
public String name; | |
public User(){ | |
} | |
public User(String name){ | |
this.name = name; | |
} | |
} |
Activity java类
public class SQLiteHelperActivity extends AppCompatActivity implements View.OnClickListener { | |
private TextView et_name; | |
private UserDBHelper mHelper; | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_sqlite_helper); | |
et_name = findViewById(R.id.et_name); | |
findViewById(R.id.btn_add).setOnClickListener(this); | |
} | |
protected void onStart() { | |
super.onStart(); | |
// 打开数据库帮助器的实例 | |
mHelper = UserDBHelper.getInstance(this); | |
// 打开数据库帮助器的读写连接 | |
mHelper.openWriteLink(); | |
mHelper.openReadLink(); | |
} | |
protected void onStop() { | |
super.onStop(); | |
mHelper.closeLink(); | |
} | |
public void onClick(View view) { | |
String name = et_name.getText().toString(); | |
User user = null; | |
switch (view.getId()){ | |
case R.id.btn_add: | |
// 以下声明一个用户信息对象,并填写它的各字段值 | |
user = new User(name); | |
if(mHelper.insert(user)>0){ | |
Toast.makeText(this,"添加成功",Toast.LENGTH_SHORT).show(); | |
} | |
break; | |
} | |
} | |
} |