sqlite是一款轻量级的关系型数据库,它的运行速度很快,占用资源少,通常只需要几百K的内存就足够了,因而现在的主流移动设备都使用sqlite作为复杂数据的存储引擎。对于Android来说,系统内置了丰富的API来提供开发人员操作sqlite,从而轻松的实现数据的操作。
sqlite 数据类型
integer — 整型 real—浮点型 text—文本类型 blob—二进制类型
新建一个类MyDatabaseHelper 继承自sqliteOpenHelper (Android为我们专门提供的一个帮助类)
- 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
public class MyDatabaseHelper extends sqliteOpenHelper {
public static final String CREATE_BOOK =
"create table Book(" +
"id integer primary key autoincrement," +
"author text,0)">"price real,0)">"name text)";
private Context mContext;
public MyDatabaseHelper(Context context,String name,
sqliteDatabase.CursorFactory factory,
int version){
super(context,name,factory,version);
mContext = context;
}
@Override
void onCreate(
sqliteDatabase db) {
db.exec
sql(CREATE_BOOK);
Toast.makeText(mContext,
"Create succeeded",Toast.LENGTH_SHORT).show();
}
void onUpgrade(
sqliteDatabase db,136)">int oldVersion,136)">int newVersion) {
}
}
更改studio 生成的自动布局文件(activity_main.xml)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height=android:orientation="vertical" tools:context="com.example.scott.sqlitetest.MainActivity">
Button "wrap_content" android:id=
"@+id/create_database" android:text=
"Create database"/>
</LinearLayout>
修改MainActivity中的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
MainActivity AppCompatActivity {
private MyDatabaseHelper dbHelper;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper =
new MyDatabaseHelper(
this,0)">"BookStore.db",136)">null,
1);
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(
new View.OnClickListener() {
@Override
void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
}
}
sqliteOpenHelper中的两个非常重要的实例方法。getReadableDatabase()和getWriteableDatabase(),这两个方法都可以创建和打开一个现有的数据库,区别在于当数据库不可写入的时候getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWriteDatabase()将出现异常
到这里我们的数据库已经创建完成了运行效果如图:
如图当我们第一次点击create database的时候会弹出Toast消息,,再次点击的时候就不会出现了说明没有运行oncreate 数据库已经创建完成了。
那怎么才能找到这个文件呢???
我电脑是windows 10 需要先配置环境变量
如图我们只要在系统变量中选择path单击编辑 然后选择新建,目录为你android SDK 中platform-tools 平台工具的文件夹配置好后我们就可以使用文件夹中的adb工具和sqlite3 工具了
使用adb 工具
首先输入adb shell进入到设备控制台。
然后使用cd 命令进行到/data/data/com.example.scott.sqlitetest/databases/目录下用 ls 命令查看该目录里的文件; 然后借助sqlite命令打开数据库,使用.table查看数据库中有哪些表,(android_Metadata 是每个数据库都会自动生成的),使用.schema查看建表语句。最后输入.exit或.quit 退出。
数据库升级其实很简单,我们只要更改sqliteOpenHelper中构造方法的第四个参数,即当前数据的版本号,只要比之前传入的数值大就可以了。
现在我想在之前的数据库中加上一列为Category 来记录书籍的分类。
继续在MyDatabaseHelper 类中添加一条建表语句:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
......
final String CREATE_CATEGORY =
"create table Category (" +
"category_name text,0)">"category_code integer)";
......
void onCreate(
sqliteDatabase db) {
db.exec
sql(CREATE_BOOK);
db.exec
sql(CREATE_CATEGORY);
Toast.makeText(mContext,Toast.LENGTH_SHORT).show();
}
......
int newVersion) {
db.exec
sql(
"drop table if exists Book");
db.exec
sql(
"drop table if exists Category");
onCreate(db);
}
设置好MyDatabaseHelper类之后,我们就可以在MainActivity中将版本号改为2 即( dbHelper = new MyDatabaseHelper(this,“BookStore.db”,null,2);),就可以对数据库进行升级了。
与上一节一样查看数据库是否创建正确。如图
我们可以看到数据库是实现了升级;
注意图中红色标记区域是因为我电脑上开了虚拟机,然后手机又是调试状态。一般情况下我都是使用真机调试
到这里我们的数据库建完了,还没有向表中添加数据。但是我们仔细看上面的数据库的的升级的时候可能发现一个问题,在升级的时候会将之前的表删除掉,那么之前表中保存的数据也会一并删除掉,造成以前程序存储在本地的数据全部丢失。那么怎样才能在升级数据库的时候不删除之前的表呢,我会在下一篇博文(Android Studio sqlite数据库应用(二))中写 sqlite事务处理的时候一并写一下。数据库升级的最佳写法
CRUD数据操作
CRUD—C (create) R(retrieve ) U(update) D(delete)
先看代码:
在布局文件中加一个按键:
1
2
3
4
5
<Button
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:
id=
"@+id/add_data"
android:
text=
"Add Data"/>
修改MainActivity 如下:
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
void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
Button addData = (Button) findViewById(R.id.add_data);
addData.setOnClickListener(
//getWritableDatabase()会返回一个sqliteDatabase对象
sqliteDatabase db = dbHelper.getWritableDatabase();
ContentValues values =
new ContentValues();
values.put(
"name",0)">"The Da Vinci Code");
values.put(
"price",102)">20);
values.put(
"pages",102)">600);
values.put(
"author",0)">"Scott");
db.insert(
"Book",values);
values.clear();
values.put(
"The Lost Symbol");
values.put(
"Scott");
values.put(
500);
values.put(
30);
db.insert(
在上面的代码中只对Book表中的四列数据进行了组装,id那一列并没有给它赋值,因为在之前将id列设置为自增长了。
接下来我们来看看表中是不是真的有数据。
输入 select * from Book;查询表中的内容,在我没有按 Add Create 的时候 显示为空,按了之后,表中有了数据。
更新数据
sqlitedatabase 提供了update()用于数据的更新。
在activity_main.xml 增加一个按键,这里就不写了。在MainActivity中怎么按键监听 ,用于数据更新。
1
2
3
4
5
6
7
8
9
10
11
12
Button updateData = (Button) findViewById(R.id.update_data);
updateData.setOnClickListener(void onClick(View v) {
sqliteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = 19.99);
db.update("name=?",136)">new String[]{
"The Da Vinci Code"});
}
});
OK 更新成功。
删除数据很简单,sqliteDatabase 提供了delete() 方法用于删除数据。这里就不写代码了具体讲一下什么意思
delete(String table,String [] whereArgs)
举个例子 delete(“Book”,”name=?”,new String[] {“The Da Vinci Code”});
就是把名字为The Da Vinci Code 这本书的数据都删除。
再比如:delete(“Book”,”price > ?”,new String[] {“20”});
意思就是把价格大于20 的所有的书都删掉。
哈哈还是很好玩的,想删什么删什么,但是要注意了 如果你第二,第三个参数不指定的话,就会删除所有行。
对于sqlite的查询功能这边我只简单介绍一下,因为前面的“增删减”只是sqlite 功能的一小部分。我想后面单独详细介绍一下sqlite的查询功能。
同样,sqliteDatabase 中提供了 query()方法用于对数据进行查询。
方法中的参数:
query(String table,String [] columns,String selection,String [] selectionArgs,String groupBy,String having,String orderBy );
table —指定查询的表名
columns —指定查询的列名
selection —指定where的约束条件
selectionArgs — 为where中的占位符提供具体的值
groupBy — 指定需要 groupBy 的列
having — 对groupBy后的结果进一步约束
orderBy — 指定查询结果的排序方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Button queryButton = (Button) findViewById(R
.id.query_data)
queryButton
.setOnClickListener(new View
.OnClickListener() {
@Override
public void onClick(View v) {
sqliteDatabase db = dbHelper
.getWritableDatabase()
//指明去
查询Book表。
Cursor cursor = db
.query(
;
//
调用moveToFirst()将数据指针移动到第一行的位置。
if (cursor
.moveToFirst()){
do {
//然后通过Cursor的getColumnIndex()
获取某一列中所对应的位置的索引
String name = cursor
.getString(cursor
.getColumnIndex(
"name"))
String author = cursor
"author"))
int pages = cursor
.getInt(cursor
"pages"))
double price = cursor
.getDouble(cursor
"price"))
Log
.d(
"MainActivity",0)">"book name is "+name)+author)+pages)+price)
}while(cursor
.moveToNext())
}
cursor
.close()
}
})
结果如图:
好了到这里就结束了,下一篇 写数据库的事务处理,还有那什么 数据库升级的最佳方式。。。
原文链接:https://www.f2er.com/sqlite/198568.html