Android应用处理数据的方法
几种数据存储方式
a. SQLiteDB
在Android中我们使用SQLiteDB作为数据库,它具有以下特点:
- Light : 轻量级
- Standard : 标准化
- Open-Src : 开源
- No Server : 没有服务器
- Single-tier : 单层的
- Loose-type : 宽松类型
- App-process : 在应用程序的进程中进行调用
下面我们挑几个SQLiteDB的特性进行介绍。
Standard :SQLite是标准兼容的,也就是说SQL语句在SQLite均可使用
Single-tier :是指SQLite是单层的,也就是不含中间层,不需要通过什么工具访问数据库,可以直接访问。
No Server :SQLite是自包含的数据库,当你创建的数据库的时候,这些数据会保存在应用中的某一个文件中
Loose-type :简单来说就是同一列中的数据可以是不同类型
b. Internal Storage (内部存储)
用于存放应用程序的相关数据,在内部存储中,每个应用对应一个文件夹,并且每个文件之间不可相互访问,应用程序只能访问与之对应的文件。
c. External Storage(外部存储)
一般用于存放较大的文件,如图片、音频等,在外部存储中的文件,每个应用程序均可访问。
d. shared preferences (偏好设置)
用于存储用户的偏好信息,用key-value的形式存储
e. remote storage (网络存储)
SQLite文件
a. 存放路径:/data/data/<package-name>/databases
SQLite文件放置于Android根目录下的data/data中,以应用程序的名称作为包名的文件夹中
b. SQLite文件是私有的,也就是说,仅该程序可访问,而其他程序不可访问。
Tips : 一般较大的文件不能直接放在Database中,而应该将大文件的URL放在Database中。
c. 创建数据库
1. 使用代码的方式进行创建(code)
- android.database.sqlite.SQLiteData ---在代码中直接使用
SQLiteDatabase sqlDB=openOrCreateDatabase("test.db",mode:SQLiteDatabase.CREATE_IF_NECESSARY,null)
sqlDB.execSQL("CREATE Table tb1(id INTERGER PRIMARY KEY, name TEXT,phone LONG)");
sqlDB.close();
例如在上述代码中,我们首先创建一个SQLiteDatebase对象,并对数据库的name,mode以及factory进行赋值。
然后调用execSQL方法执行数据库语句来创建表。
SQLiteDatabase的具体使用方法参考开发文档:
https://developer.android.google.cn/reference/kotlin/android/database/sqlite/SQLiteDatabase?hl=en
- SQLiteOpenHelper
android.database.sqlite.SQLiteData一般直接在Activity中就可直接使用,但是这样会导致代码的耦合度过高,为了降低掉吗的耦合度,我们采用SQLiteOpenHelper来进行数据库的相关操作。
值得注意的是,SQLiteOpenHelper是一个抽象类,因此我们在使用的使用需要实现该抽象类,具体的使用方法如下。
在这里我们为了更好的展示,将代码分为两个部分。
public class MainActivity extends AppCompatActivity {
...code...
/*在OnCreate直接调用我们所实现的SQLiteOpenHelper类进行数据的插入
(在这里我们将其命名为Datahelper)
*/
@Override
protected void onCreate() {
Button bt1 =(Button) findViewById(R.id.button1);
bt1.setOnClickListener(new View.OnClickListener(){....});
Datahelper dh = new DataHelper(); //创建我们实现的Datahelper对象
dh.insert(te.text()); //假设有个名为te的控件,我们获取其中的text并通过Datahelper对象将其插入到数据库中
}
/*实现SQLiteOpenHelper抽象类*/
public class DataHelper{
SQLiteDatabase sqlDB; //创建一个数据库对象(在android.database.sqlite.SQLiteData部分我们已经做了介绍)
OpenHelper oh;
private final static String dataName; //定义数据库的名称
public DataHelper(){
oh = new OpenHelper(this.Context); //用于创建OpenHelper类对象,其中this.Context表示获取当前的上下文对象
sqlDB = oh.getWritableDatabase(); //定义为可写的
}
insert() //实现数据库的插入方法
{
sqlDB.insert();
}
getTable() //实现数据库获取表的方法
{
SQLiteDatabase sqlDB = openorCreate
}
/*实现SQLiteHelper抽象类
*实现SQLiteHelper类中的两个方法
*onpenHelper方法
*onCreate方法
*/
private static class Openhelper extends SQLiteHelper
{
public OpenHelper (Context context){
super(context,dataName,.....);
}
void onCreate(SQLiteDatabase db){
db.execSQL("create table...");
}
}
}
2. 使用Linux shell进行创建
- 使用cmd命令打开adb.exe
- 输入adb shell 进入android 的 linux 命令操作方式
- 切换到应用对应的存放数据库的文件路径下(这里博主创建的项目为myapp)
- 输入sqlite3 <database-name> 例如:sqlite3 test.db //即创建一个名为 test 的数据库
- 接下来就可以进行创建表格插入数据等操作,在这里就不一一赘述了
- 最后使用 exit 可退出Linux Shell
d. 存储/获取数据库中的信息
- Insert,delete,Update
我们需要先创建一个数据库,根据上面的介绍,我们可以采用两种方式进行创建,由于上面已经给出了实现方法,在这里博主就不重复创建,直接用我们已经创建好的database进行增删改操作。
已有的数据库结构 :
- <database> - test.db
- <table-name> - tb1
- <column-name> - name , phone
在Activity类中,我们用一个按钮来触发数据库的插入操作,下列这段代码放在OnCreate方法中。
TextView tv = (TextView) findViewById(R.id.text1);
Button bt1 =(Button) findViewById(R.id.button1);
bt1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(){
TextView tv = (TextView) findViewById(R.id.text1);
tv.setText("INSERT");
SQLiteDatabase sqlDB = openOrCreateDatabase("test.db", SQLiteDatabase.CREATE_IF_NECESSARY,null);
sqlDB.execSQL("INSERT INTO tb1(name,phone) values('name1','123123123123')");
sqlDB.close();
}
});
运行完程序,我们点击按钮后,重新回到命令行窗口,查找我们数据库中已有表tb1中的数据,发现该记录已经成功写入。
接下来我们来到Android开发文档中找到SQLiteDatabase中的insert方法。
可以发现 SQLiteDatabase的insert方法有三个参数,其中table表示表名,nullColumnHack表示当表的某行为空时用来代替的字符串,还有一个就是ContentValues,我们接着介绍一下它。
- ContentValue(Android提供的一种数据类型) - 常用于Android中数据库的添加
我们在刚刚进行INSERT操作的方法中进行修改,用ContentValue的方式来实现
- 创建一个ContentValue对象
- 使用put方法,将对应输入的内容与每一列的名称对应起来
- 最后使用SQLiteDatabase中的 insertOrThrow 方法进行插入。
Tips:这里值得注意的是,insertOrThrow 方法如果插入时出现异常,该方法会抛出异常,因此我们需要将它写在 try-catch 代码块中,并在 catch 中将错误信息写入Android的Log中。
TextView tv = (TextView) findViewById(R.id.text1);
Button bt1 =(Button) findViewById(R.id.button1);
bt1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(){
TextView tv = (TextView) findViewById(R.id.text1);
tv.setText("INSERT");
SQLiteDatabase sqlDB = openOrCreateDatabase("test.db", SQLiteDatabase.CREATE_IF_NECESSARY, null);
ContentValues cv = new ContentValues();
cv.put("name", "name2");
cv.put("phone", 123123123123L);
try {
sqlDB.insertOrThrow("tb1", null, cv);
} catch (Exception e) {
Log.e("DBerror", e.getMessage());
}
}
});
我们同样运行程序,触发该点击事件后 重新回到命令行窗口,查找我们数据库中已有表tb1中的数据,发现该记录已经成功写入。
- Retrieve records from a table; (从表中获取记录)
我们可以通过SQLiteDatabase中的query()方法来实现从表中获取记录
同样我们先看看在Android开发文档中是如何定义query方法的。
从文档中我们可以看到query方法具有多种调用方式,在这里我们选择第一种进行进一步的探讨。
- distinct :如果希望每行唯一,则为true;否则为false。
- table :要查询的表名。
- columns :要查询的列
- selection :声明要返回哪些行的筛选器,格式为sql where子句(不包括where本身)。传递null将返回给定表的所有行。
- limit :限制查询返回的行数,传递null表示没有限制。
Tips :值得注意的是,使用该方法返回的将会是一个Cursor(指针),接下来我们用query方法来实现数据库的查询。
TextView tv = (TextView) findViewById(R.id.text1);
Button bt1 = (Button) findViewById(R.id.button1);
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
TextView tv = (TextView) findViewById(R.id.text1);
tv.setText("Dial");
try {
String[] fields = {"name"}; //查询的列名
Cursor c = sqlDB.query("tb1", fields, null, null, null, null, null, null);
/*将指针指向开头
*判断是否为空
*不为空则将查询的结果加入到TextView的文本中进行显示
*将指针移向下一位
*/
if (c.moveToFirst()) {
while (c.isAfterLast() == false) {
tv.append(c.getString(0) + " ");
c.moveToNext();
}
}
/*如果指针不为空,则关闭该指针*/
if (c != null)
c.close();
} catch (Exception e) {
Log.e("DBerror", e.getMessage());
} finally {
/*关闭数据库*/
if (sqlDB != null)
sqlDB.close();
}
}
});
结果展示: