我是靠谱客的博主 柔弱耳机,这篇文章主要介绍Android学习笔记--Sqlite数据库,现在分享给大家,希望可以做个参考。

      前几天学习了Android中的数据存储,包括文件存储,SharedPreferences存储,还有就是Acndroid中的特色:SQLite数据库存储了。让我比较惊讶的是Android中竟然内嵌了一个轻量型的数据库SQLite数据库,使得本地的数据持久化有了一个质的飞跃。

      通过前两天上课听老师讲解,和课下自己看书总结,想在博客上把自己对于SQLite数据库的理解做一下总结,也是方便之后的复习。Android为了让我们能够更加方便的管理数据库,专门提供了SQLiteOpenHelper帮助类,这个类是一个抽象类,在这个类中,有两个抽象方法,一个是onCreate(),一个是onUpdate(),我们必须在自己的帮助类中继承SQLiteOpenHelper,并实现这两个抽象方法,并分别在这两个抽象方法中完成表的创建和数据库的更新和维护。SQLiteOpenHelper中还有两个非常重要的实例方法,getReadableDatabase()和getWriteableDatabase()。这两个方法都可以打开或创建一个现有的数据库(若数据库已经存在久直接打开,否则创建一个新的数据库),并返回一个可对数据库进行操作的对象。不同的是,当数据库不可以写入的时候(如磁盘空间已满),getReadableDatabase()方法返回的对象以只读的方式打开数据库,而getWriteableDatabase()方法出现异常(正如常常情况下使用二者获得的对象都具有读写功能)。SQLiteOpenHelper有两个构造方法可以重写,这里我们选择参数少的那一个。这个构造方法里面接收4个参数,第一个参数Context,这个没什么好说的,代表上下文,必须要有它才能对数据库进行操作;第二个参数是数据库名,他代表我们将要创建的数据库的名字;第三个参数允许我们创建数据库的时候返回一个自定义的Curs o r,一般都是传入nu ll;第四个参数代表当前数据库的版本号,可以用于数据库升级操作

      构建出SQLiteOpenHelper实例后,再调用它的getReadableDatabase()或着getWriteableDatabase()方法就可以创建出数据库了,数据库文件会存放在/data/data/<package name >/databases目录下。此时重写的onCreate方法也会执行,通常在里面完成一些表的创建操作。

      SQLite数据库不像其他数据库拥有众多繁杂的数据类型,它的常用的数据类型很简单:integer代型,real代表浮点型,text代表文本型,blob代表二进制类型。

      由于创建好的数据库虽然能在File Explorer中看到, 但却不能看到其内部包含的表,还有表中的数据,所以我们在这里使用adb shell来查看,使用adb shell需要配置adb的环境变量在这里不再叙述,网上有简单的教程。配置好环境变量后,Win+R中输入cmd进入命令提示符模式,输入adb shell进入adb环境,然后输入命令:cd /data/data/<package name >/databases进入到该目录下,输入ls来查看目录下的文件,此时输入sqlite3+数据库名即进入sql编辑模式。键入.table可以查看数据库中有哪些表,键入.schema命令可以查看建表语句。(在sqlite编辑模式下每句语句后面都要有';'结束)。下面通过一个小Demo来讲解SQLi te数据库中的CRUD操作以及数据库的一些其他需要注意的地方。

      首先创建我们自己的SQLOpenHelper类继承自SQLiteOpenHelper,并重写其中的方法和构造函数:

复制代码
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
1 package com.example.databasetest; 2 3 import android.content.Context; 4 import android.database.sqlite.SQLiteDatabase; 5 import android.database.sqlite.SQLiteDatabase.CursorFactory; 6 import android.database.sqlite.SQLiteOpenHelper; 7 8 public class SqlOpenHelper extends SQLiteOpenHelper { 9 10 public static final String CREATE_BOOK = "create table book(" 11 + "id integer primary key autoincrement, " 12 + "name text," 13 + "price real)"; 14 public SqlOpenHelper(Context context, String name, CursorFactory factory, 15 int version) { 16 super(context, name, factory, version); 17 // TODO Auto-generated constructor stub 18 } 19 20 @Override 21 public void onCreate(SQLiteDatabase db) { 22 // TODO Auto-generated method stub 23 db.execSQL(CREATE_BOOK); 24 } 25 26 @Override 27 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 28 // TODO Auto-generated method stub 29 } 30 } 31 32 }

 可以看到我们在重写的onreate方法中调用SQLiteDatbas的execSQL()方法建了一个表book

然后在我们的主界面中添加了四个按钮,用于创建数据库病完成CRUD操作:

复制代码
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
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 > 7 8 <Button 9 android:id="@+id/btn1" 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" 12 android:text="CREATE_BOOK"/> 13 <Button 14 android:id="@+id/btn2" 15 android:layout_width="match_parent" 16 android:layout_height="wrap_content" 17 android:text="update"/> 18 <Button 19 android:id="@+id/btn3" 20 android:layout_width="match_parent" 21 android:layout_height="wrap_content" 22 android:text="delete"/> 23 <Button 24 android:id="@+id/btn4" 25 android:layout_width="match_parent" 26 android:layout_height="wrap_content" 27 android:text="select"/> 28 </LinearLayout>
activity_main

 我们在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
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
1 1 package com.example.databasetest; 2 2 3 3 import android.app.Activity; 4 4 import android.content.ContentValues; 5 5 import android.database.Cursor; 6 6 import android.database.sqlite.SQLiteDatabase; 7 7 import android.os.Bundle; 8 8 import android.util.Log; 9 9 import android.view.View; 10 10 import android.view.View.OnClickListener; 11 11 import android.widget.Button; 12 12 import android.widget.Toast; 13 13 14 14 public class MainActivity extends Activity implements OnClickListener { 15 15 16 16 private Button btn1,btn2,btn3,btn4; 17 17 private SqlOpenHelper helper; 18 18 private SQLiteDatabase db; 19 19 @Override 20 20 protected void onCreate(Bundle savedInstanceState) { 21 21 super.onCreate(savedInstanceState); 22 22 setContentView(R.layout.activity_main); 23 23 helper=new SqlOpenHelper(this, "book_store", null, 1); 24 24 btn1=(Button) findViewById(R.id.btn1); 25 25 btn2=(Button) findViewById(R.id.btn2); 26 26 btn3=(Button) findViewById(R.id.btn3); 27 27 btn4=(Button) findViewById(R.id.btn4); 28 28 btn1.setOnClickListener(this); 29 29 btn2.setOnClickListener(this); 30 30 btn3.setOnClickListener(this); 31 31 btn4.setOnClickListener(this); 32 32 } 33 33 34 34 35 35 @Override 36 36 public void onClick(View v) { 37 37 // TODO Auto-generated method stub 38 38 switch (v.getId()) { 39 39 case R.id.btn1: 40 40 db = helper.getWritableDatabase(); 41 41 db.beginTransaction(); //开始事务 42 42 try { 43 43 ContentValues values=new ContentValues(); 44 44 values.put("name", "Android"); 45 45 values.put("price", 16.5); 46 46 values.put("category_id", "1"); 47 47 db.insert("book", null, values); 48 48 db.setTransactionSuccessful(); //事务已经成功执行 49 49 Toast.makeText(this, "Create Success", Toast.LENGTH_SHORT).show(); 50 50 } catch (Exception e) { 51 51 // TODO Auto-generated catch block 52 52 e.printStackTrace(); 53 53 }finally{ 54 54 db.endTransaction(); //结束事务 55 55 db.close(); 56 56 } 57 57 break; 58 58 case R.id.btn2: 59 59 db=helper.getWritableDatabase(); 60 60 ContentValues values=new ContentValues(); 61 61 values.put("name", "zhangsan"); 62 62 values.put("price", 20); 63 63 db.update("book", values, "id=?", new String[]{5+""}); 64 64 break; 65 65 case R.id.btn3: 66 66 db=helper.getWritableDatabase(); 67 67 db.delete("book", "id=?",new String[]{1+""} ); 68 68 break; 69 69 case R.id.btn4: 70 70 db=helper.getWritableDatabase(); 71 71 Cursor cursor=db.query("book", null, null, null, null, null, "id DESC"); 72 72 while(cursor.moveToNext()){ 73 73 String name=cursor.getString(cursor.getColumnIndex("name")); 74 74 String price=String.valueOf(cursor.getFloat(2)); 75 75 Log.d("MainActivity", name); 76 76 Log.d("MainActivity", price); 77 77 } 78 78 break; 79 79 default: 80 80 break; 81 81 } 82 82 } 83 83 84 84 }

其中btn1代表创建数据库并向数据库中添加数据,btn2的点击事件是向数据库中更新数据,btn3则是删除操作,btn4是最为复杂的查询操作。

在向表中插入数据的时候,用到了事务,事务中的操作是要么都做,要么都不做,可以保证数据的正确。在每次操作数据库前,先使用我们自定义的帮助类的getWriteableDatabase()来打开(创建)数据库,并返回一个SQLiteDatabase类型的可操作对象。

添加数据:

调用SQLiteDatabase的insert方法,我们使用方法中有三个参数的那个就可以,第一个参数代表要操作的数据库表名,第二个参数表示哪列的值为空,一般填null,第三个参数则表示要插入的数据,是为ContentValues类型,ContentValues类型的变量有一个put方法,可以将数据以键-值对的形式存储。

更新数据:

SQLiteDatabase.update方法,我们使用有四个参数的方法,第一个参数还是代表我们要操作的数据库,第二个参数是要更新的值,为ContentValues类型,还是通过他的put方法来将要更新的值以键-值对的形式存储,第三个参数是相当于where条件,它跟第四个参数以占位符的方式来组成where条件,控制更新哪些满足条件的行。如:

复制代码
1
2
db.update("book", values, "id=?", new String[]{5+""}); id=? 第四个参数中的值则为'?'部分内容

若这两个参数填null,则更新所有行。该方法返回一个整型结果,为受影响行数。

删除数据:

SQLiteDatabase.delete方法,该方法有三个参数,第一个参数是代表我们要操作的数据库,第二个第三个参数与update中的基本一样,不在叙述。

查询数据:

也是数据库中最为复杂的一种操作,在此只简单地说下其用法,数据库的查询方法返回一个Cursor类型变量,我们通过Cursor的moveToNext方法来取出查询结果。查询有好多种写法可以使用,比如本Demo中的SQLiteDatabase.query方法,接收7个参数,不过我们不用担心,我们先不去管这些参数,只用第一个参数:要查询的表。和最后一个参数:按照id降序排列。然后再一个while循环中通过Cursor.getString()将值取出来。此方法的7个参数含义如下:

 

使用上面的方法来操作数据库得益于Android给我们提供的方便的API,这样即使我们不太懂SQL语言,也可以做出操作数据库的操作,但其实我们还可以使用SQL方式来操作数据库:

添加数据的方法:

db.execSQL("insert into book(name,price) values("haha",23)");  //sql语句方式

db.execSQL("insert into book(name,price) values(?,?)",new String[]{"haha",34});  //占位符的方式

更新数据:

db.execSQL("update book set name=? where id=?",new String[]{"pig",2+""});

删除数据:

db.execSQL("delete from book where id>?",new String[]{"3"});

查询数据:

db.rawQuery("select * from book",null);    //第二个参数是查询条件

 

转载于:https://www.cnblogs.com/RabbitLx/p/5470232.html

最后

以上就是柔弱耳机最近收集整理的关于Android学习笔记--Sqlite数据库的全部内容,更多相关Android学习笔记--Sqlite数据库内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(85)

评论列表共有 0 条评论

立即
投稿
返回
顶部