朋友圈里的每一个消息体里面的数据,当下拉刷新从服务器下载数据包后,存入sqlite:用户名、图片url、点赞、评论等等。上拉加载的时候,从数据库里取出最近的5条数据加载到朋友圈上。
Android通过SQLite数据库引擎来实现结构化数据存储。SQLite是一个嵌入式数据库引擎,针对内存等资源有限的设备(如手机、PDA、MP3)提供的一种高效的数据库引擎。
SQLIte数据库不像其他数据库(如Oracle),它没有服务器进程。所有的内容包含在同一个单文件中。该文件是跨平台的,可以自由复制。基于其自身的先天优势,SQLite在嵌入式领域得到了广泛应用。Android也没有重复发明“轮子”,而是直接使用了SQLite数据库。
1、SQLiteDatabase
Android提供了创建和使用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法,另外还有一个SQLiteOpenHelper工具类提供了更简洁的功能。在Android的SDK目录下有个sqlite3工具,我们可以使用它来创建数据库、创建表和执行一些SQL语句。
SQLiteDatabase常用方法
方法名称 | 方法描述 |
openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory) | 打开或创建数据库 |
insert(Sting table,String nullColumnHack,ContentValues values) | 添加一条记录 |
delete(String table,String whereClause,String[] whereArgs) | 删除一条记录 |
query(String table,String[] columns,String selection,String[] selectionArgs, String groupBy,String having,String orderBy) | 查询记录 |
update(String table,ContentValues values,String whereClause,String[] whereArgs) | 修改记录 |
execSQL(String sql) | 执行一条SQL语句 |
close() | 关闭数据库 |
1)、打开或者创建数据库
可以使用SQLiteDatabase的静态方法openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)打开或创建一个数据库,该方法的第一个参数是数据库创建路径,注意这个路径一定是数据库全路径。例如:/data/data/package/database/dbname.db。第二个参数是指定返回一个Cursor子类的工厂,如果没有指定(null)则使用默认工厂。
1. SQLiteDatabase.openOrCreateDatabase("/data/data/mx.android.ch09/database/temp.db", null);
1. SQLiteDatabase.openOrCreateDatabase("/data/data/mx.android.ch09/database/temp.db", null);
2)、创建表
首先编写创建表的SQL语句,然后调用SQLiteDatabase的execSQL()方法。
1. public void
2. //创建SQL语句
3. "create table UserTbl(_id integer primary key autoincrement,username text,password text)";
4. //执行SQL语句
5. db.execSQL(sql);
6. }
1. public void
2. //创建SQL语句
3. "create table UserTbl(_id integer primary key autoincrement,username text,password text)";
4. //执行SQL语句
5. db.execSQL(sql);
6. }
3)、插入数据
有两种方法:一种是调用SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法,该方法的第一个参数是表名称,第二个参数的空列的默认值,第三个参数是ContentValues类型的一个封装了列名称和列值的Map;另一种方法是编写插入数据的SQL语句、直接调用SQLiteDatabase的execSQL()方法来执行。
1. public void
2. "insert into UserTbl(username,password) values ('mx','123')";
3. db.execSQL(sql);
4. }
1. public void
2. "insert into UserTbl(username,password) values ('mx','123')";
3. db.execSQL(sql);
4. }
1. public void
2. //实例化常量值
3. new
4. "username","mx");
5. "password", "123");
6. "UserTbl",null, cv);
7. }
1. public void
2. //实例化常量值
3. new
4. "username","mx");
5. "password", "123");
6. "UserTbl",null, cv);
7. }
4)、删除数据
有两种方法:一种的调用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法,该方法的第一个参数是表名称,第二个参数是删除条件,第三个参数的删除条件值数组;另一种方法是编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除。
1. public void
2. "delete from UserTbl where _id = 1";
3. db.execSQL(sql);
4. }
1. public void
2. "delete from UserTbl where _id = 1";
3. db.execSQL(sql);
4. }
1. public void
2. "_id=?";
3. 1)};
4. "UserTbl", whereClause, whereArgs);
5. }
1. public void
2. "_id=?";
3. 1)};
4. "UserTbl", whereClause, whereArgs);
5. }
5)、查询数据
下面看一个查询方法。
1. public
2. String groupBy,String having,String orderBy,String limit)。
1. public
2. String groupBy,String having,String orderBy,String limit)。
各个参数的意义说明如下:
- table:表名称
- columns:列名称数组
- selection:条件子句,相当于where
- selectionArgs:条件子句,参数数组
- groupBy:分组列
- having:分组条件
- orderBy:排序列
- limit:分页查询限制
- Cursor:返回值,相当于结果集ResultSet
Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move()、获得列值方法getString()等。
Cursor游标常用方法
方法名称 | 方法描述 |
getCount() | 总记录条数 |
isFirst() | 判断是否是第一条记录 |
isLast() | 判断是否是最后一条记录 |
moveToFirst() | 移动到第一条记录 |
moveToLast() | 移动到最后一条记录 |
move(int offset) | 移动到指定记录 |
moveToNext() | 移动到下一条记录 |
moveToPrevision() | 移动到上一条记录 |
getColumnIndexOrThrow(String columnName) | 根据列名获得列索引 |
getInt(int columnIndex) | 获得指定列索引的int类型值 |
getString(int columnIndex) | 获得指定列索引的String类型值 |
下面代码演示了如何查询数据记录。
1. public void
2. //查询获得游标
3. "UserTbl", null, null, null, null, null, null);
4. //判断游标是否为空
5. if(c.moveToFirst()){
6. //遍历游标
7. for (int i = 0; i < c.getCount(); i++) {
8. c.move(i);
9. //获得Id
10. int id = c.getInt(0);
11. //获得用户名
12. 1);
13. //获得密码
14. 2);
15. //输出用户信息
16. ":" + username + ":"
17. }
18. }
19. }
1. public void
2. //查询获得游标
3. "UserTbl", null, null, null, null, null, null);
4. //判断游标是否为空
5. if(c.moveToFirst()){
6. //遍历游标
7. for (int i = 0; i < c.getCount(); i++) {
8. c.move(i);
9. //获得Id
10. int id = c.getInt(0);
11. //获得用户名
12. 1);
13. //获得密码
14. 2);
15. //输出用户信息
16. ":" + username + ":"
17. }
18. }
19. }
6)、修改数据
有两种方式:一种是调用SQLiteDatabase的update(String table,ContentValues values,String whereClause,String[] whereArgs)方法。该方法的第一个参数是表名称,第二个参数是更新列ContentValues类型的键-值对(Map),第三个参数是更新条件(where子句),第四个参数是更新条件的值数组。二是编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新。
1. public void
2. "update UserTbl set password = 321 where _id = 1";
3. db.execSQL(sql);
4. }
5.
6. public void
7. new
8. "password", "321");
9. "_id=?";
10. 1)};
11. "UserTbl", values, whereClause, whereArgs);
12. }
1. public void
2. "update UserTbl set password = 321 where _id = 1";
3. db.execSQL(sql);
4. }
5.
6. public void
7. new
8. "password", "321");
9. "_id=?";
10. 1)};
11. "UserTbl", values, whereClause, whereArgs);
12. }
2、SQLiteOpenHelper
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本更新。一般的用法是定义一个类继承之,并实现其两个抽线方法onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)来创建和更新数据库。
SQLiteOpenHelper常用方法
方法名称 | 方法描述 |
SQLiteOpenHelper(Context context,String name, SQLiteDatabase.CursorFactory factory,int version) | 构造方法,一般是传递一个要创建的 数据库名称name参数 |
onCreate(SQLiteDatabase db) | 创建数据库调用 |
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) | 版本更新调用 |
getReadableDatabase() | 创建或打开一个只读数据库 |
getWritableDatabase() | 创建或打开一个读写数据库 |
下面的代码演示了通过继承SQLiteOpenHelper来实现创建数据库、创建表、插入数据和查询数据的过程。
1. public class TestSQLiteActivity extends
2. @Override
3. protected void
4. super.onCreate(savedInstanceState);
5. setContentView(R.layout.sqlite);
6. //实例化数据库帮助类
7. new MyDBHelper(this);
8. //插入
9. helper.insert();
10. //查询
11. helper.query();
12. }
13.
14. //数据库帮助类
15. class MyDBHelper extends
16. //创建SQL语句
17. private static final String CREATE_TABLE_SQL = "create table TempTb1(_id integer,name text)";
18. //SQLiteDatabase实例
19. private
20. //构造方法
21. public
22. super(c, "test.db", null, 2);
23. }
24. @Override
25. public void
26. //创建表
27. db.execSQL(CREATE_TABLE_SQL);
28. }
29. @Override
30. public void onUpgrade(SQLiteDatabase db, int oldVersion, int
31.
32. }
33. //插入方法
34. private void
35. //插入SQL语句
36. "insert into TempTb1(_id,name) values(1,'mx')";
37. //执行插入
38. getWritableDatabase().execSQL(sql);
39. }
40. //查询方法
41. private void
42. //获得查询游标
43. "TempTb1", null, null, null, null, null, null);
44. //判断游标是否为空
45. if(c.moveToFirst()){
46. //遍历游标
47. for (int i = 0; i < c.getCount(); i++) {
48. c.move(i);
49. int id = c.getInt(0);
50. 1);
51. ":"
52. }
53. }
54. }
55. }
56. }
1. public class TestSQLiteActivity extends
2. @Override
3. protected void
4. super.onCreate(savedInstanceState);
5. setContentView(R.layout.sqlite);
6. //实例化数据库帮助类
7. new MyDBHelper(this);
8. //插入
9. helper.insert();
10. //查询
11. helper.query();
12. }
13.
14. //数据库帮助类
15. class MyDBHelper extends
16. //创建SQL语句
17. private static final String CREATE_TABLE_SQL = "create table TempTb1(_id integer,name text)";
18. //SQLiteDatabase实例
19. private
20. //构造方法
21. public
22. super(c, "test.db", null, 2);
23. }
24. @Override
25. public void
26. //创建表
27. db.execSQL(CREATE_TABLE_SQL);
28. }
29. @Override
30. public void onUpgrade(SQLiteDatabase db, int oldVersion, int
31.
32. }
33. //插入方法
34. private void
35. //插入SQL语句
36. "insert into TempTb1(_id,name) values(1,'mx')";
37. //执行插入
38. getWritableDatabase().execSQL(sql);
39. }
40. //查询方法
41. private void
42. //获得查询游标
43. "TempTb1", null, null, null, null, null, null);
44. //判断游标是否为空
45. if(c.moveToFirst()){
46. //遍历游标
47. for (int i = 0; i < c.getCount(); i++) {
48. c.move(i);
49. int id = c.getInt(0);
50. 1);
51. ":"
52. }
53. }
54. }
55. }
56. }
3、SQLite应用实例——收藏管理
通过使用SQLite对自己比较喜欢的网站进行收藏管理。收藏信息包括编号、网站名称、URL和网站内容描述,可以实现的功能有添加、删除和浏览等。
1)、创建操作数据库的工具类DBHelper,该类继承SQLiteOpenHelper。覆盖onCreate()和onUpgrade()方法,并添加inisert()、del()、query()方法,分别用来添加、删除和查询数据。
1. public class DBHelper extends
2. //数据库名称
3. private static final String DB_NAME = "coll.db";
4. //表名称
5. private static final String TBL_NAME = "CollTbl";
6. //创建表SQL语句
7. private static final String CREATE_TBL = "create table CollTbl(_id integer primary key "
8. "autoincrement,name text,url text,desc text)";
9. //SQLiteDatabase实例
10. private
11. //构造方法
12. public
13. super(c, DB_NAME, null, 2);
14. }
15. //创建表
16. @Override
17. public void
18. this.db = db;
19. db.execSQL(CREATE_TBL);
20.
21. }
22. //插入方法
23. public void
24. //获得SQLiteDatabase实例
25. SQLiteDatabase db = getWritableDatabase();
26. //插入
27. null, values);
28. db.close();
29. }
30. //查询方法
31. public
32. //获得SQLiteDatabase实例
33. SQLiteDatabase db = getWritableDatabase();
34. //查询获得Cursor
35. null, null, null, null, null, null);
36. return
37. }
38. //删除方法
39. public void delete(int
40. if(db == null)
41. db = getWritableDatabase();
42. "_id=?", new
43. }
44. //关闭数据库
45. public void
46. if(db != null)
47. db.close();
48. }
49. @Override
50. public void onUpgrade(SQLiteDatabase db, int oldVersion, int
51.
52. }
53. }
1. public class DBHelper extends
2. //数据库名称
3. private static final String DB_NAME = "coll.db";
4. //表名称
5. private static final String TBL_NAME = "CollTbl";
6. //创建表SQL语句
7. private static final String CREATE_TBL = "create table CollTbl(_id integer primary key "
8. "autoincrement,name text,url text,desc text)";
9. //SQLiteDatabase实例
10. private
11. //构造方法
12. public
13. super(c, DB_NAME, null, 2);
14. }
15. //创建表
16. @Override
17. public void
18. this.db = db;
19. db.execSQL(CREATE_TBL);
20.
21. }
22. //插入方法
23. public void
24. //获得SQLiteDatabase实例
25. SQLiteDatabase db = getWritableDatabase();
26. //插入
27. null, values);
28. db.close();
29. }
30. //查询方法
31. public
32. //获得SQLiteDatabase实例
33. SQLiteDatabase db = getWritableDatabase();
34. //查询获得Cursor
35. null, null, null, null, null, null);
36. return
37. }
38. //删除方法
39. public void delete(int
40. if(db == null)
41. db = getWritableDatabase();
42. "_id=?", new
43. }
44. //关闭数据库
45. public void
46. if(db != null)
47. db.close();
48. }
49. @Override
50. public void onUpgrade(SQLiteDatabase db, int oldVersion, int
51.
52. }
53. }
2)、创建视图布局文件add.xml,在其中添加三个TextView和三个EditText,分别用来输入网站名称、URL和网站描述信息,一个Button响应单击事件,当用户单击时将信息保存到数据库中。
1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2. android:layout_width="fill_parent" android:layout_height="fill_parent"
3. android:orientation="vertical" android:layout_gravity="center_vertical" >
4.
5. <TextView
6. android:text="网站名称"
7. android:id="@+id/s_TextView01"
8. android:layout_width="wrap_content"
9. android:layout_height="wrap_content" />
10.
11. <EditText
12. android:text=""
13. android:id="@+id/s_EditTextName"
14. android:layout_width="fill_parent"
15. android:layout_height="wrap_content" />
16.
17. <TextView
18. android:text="URL"
19. android:id="@+id/s_TextView02"
20. android:layout_width="wrap_content"
21. android:layout_height="wrap_content" />
22.
23. <EditText
24. android:text=""
25. android:id="@+id/s_EditTextURL"
26. android:layout_width="fill_parent"
27. android:layout_height="wrap_content" />
28.
29. <TextView
30. android:text="网站描述"
31. android:id="@+id/s_TextView03"
32. android:layout_width="wrap_content"
33. android:layout_height="wrap_content" />
34.
35. <EditText
36. android:text=""
37. android:id="@+id/s_EditTextDesc"
38. android:layout_width="fill_parent"
39. android:layout_height="wrap_content" />
40.
41. <Button
42. android:text="添加"
43. android:id="@+id/s_ButtonAdd"
44. android:layout_width="wrap_content"
45. android:layout_height="wrap_content" />
46.
47. </LinearLayout>
1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2. android:layout_width="fill_parent" android:layout_height="fill_parent"
3. android:orientation="vertical" android:layout_gravity="center_vertical" >
4.
5. <TextView
6. android:text="网站名称"
7. android:id="@+id/s_TextView01"
8. android:layout_width="wrap_content"
9. android:layout_height="wrap_content" />
10.
11. <EditText
12. android:text=""
13. android:id="@+id/s_EditTextName"
14. android:layout_width="fill_parent"
15. android:layout_height="wrap_content" />
16.
17. <TextView
18. android:text="URL"
19. android:id="@+id/s_TextView02"
20. android:layout_width="wrap_content"
21. android:layout_height="wrap_content" />
22.
23. <EditText
24. android:text=""
25. android:id="@+id/s_EditTextURL"
26. android:layout_width="fill_parent"
27. android:layout_height="wrap_content" />
28.
29. <TextView
30. android:text="网站描述"
31. android:id="@+id/s_TextView03"
32. android:layout_width="wrap_content"
33. android:layout_height="wrap_content" />
34.
35. <EditText
36. android:text=""
37. android:id="@+id/s_EditTextDesc"
38. android:layout_width="fill_parent"
39. android:layout_height="wrap_content" />
40.
41. <Button
42. android:text="添加"
43. android:id="@+id/s_ButtonAdd"
44. android:layout_width="wrap_content"
45. android:layout_height="wrap_content" />
46.
47. </LinearLayout>
3)、创建AddActivity,声明用到的组件类EditText和Button,在onCreate()方法中进行初始化,响应Button的单击事件方法,该方法从编辑框中获得数据项,封装到ContentValues对象中,调用DBHelper进行保存,之后跳转到显示收藏记录QueryActivity界面。
1. public class AddActivity extends
2. //声明EditText实例
3. private
4. //声明Button实例
5. private
6. @Override
7. protected void
8. super.onCreate(savedInstanceState);
9. setContentView(R.layout.add);
10. this.setTitle("添加收藏信息");
11. et1 = (EditText) findViewById(R.id.s_EditTextName);
12. et2 = (EditText) findViewById(R.id.s_EditTextURL);
13. et3 = (EditText) findViewById(R.id.s_EditTextDesc);
14. b1 = (Button) findViewById(R.id.s_ButtonAdd);
15. new
16. @Override
17. public void
18. String name = et1.getText().toString();
19. String url = et2.getText().toString();
20. String desc = et3.getText().toString();
21. //内容值实例
22. new
23. "name", name);
24. "url", url);
25. "desc", desc);
26. //实例化数据库帮助类
27. new
28. //插入数据
29. helper.insert(values);
30. //实例化Intent
31. new Intent(AddActivity.this,QueryActivity.class);
32. startActivity(intent);
33. }
34. });
35. }
36. }
[java] view plain copy
1. public class AddActivity extends
2. //声明EditText实例
3. private
4. //声明Button实例
5. private
6. @Override
7. protected void
8. super.onCreate(savedInstanceState);
9. setContentView(R.layout.add);
10. this.setTitle("添加收藏信息");
11. et1 = (EditText) findViewById(R.id.s_EditTextName);
12. et2 = (EditText) findViewById(R.id.s_EditTextURL);
13. et3 = (EditText) findViewById(R.id.s_EditTextDesc);
14. b1 = (Button) findViewById(R.id.s_ButtonAdd);
15. new
16. @Override
17. public void
18. String name = et1.getText().toString();
19. String url = et2.getText().toString();
20. String desc = et3.getText().toString();
21. //内容值实例
22. new
23. "name", name);
24. "url", url);
25. "desc", desc);
26. //实例化数据库帮助类
27. new
28. //插入数据
29. helper.insert(values);
30. //实例化Intent
31. new Intent(AddActivity.this,QueryActivity.class);
32. startActivity(intent);
33. }
34. });
35. }
36. }
4)、创建显示记录QueryActivity。该类继承ListActivity,将从数据库查询的记录通过ListView显示在列表中。并且当用户点击某条记录时,通过对话框提示用户是否删除此记录。
row.xml
1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2. android:layout_width="fill_parent" android:layout_height="fill_parent"
3. android:orientation="horizontal" android:layout_gravity="center_vertical" >
4.
5. <TextView
6. android:id="@+id/r_text0"
7. android:layout_width="wrap_content"
8. android:layout_height="wrap_content"
9. android:paddingRight="10px" />
10.
11. <TextView
12. android:id="@+id/r_text1"
13. android:layout_width="wrap_content"
14. android:layout_height="wrap_content"
15. android:paddingRight="10px" />
16.
17. <TextView
18. android:id="@+id/r_text2"
19. android:layout_width="wrap_content"
20. android:layout_height="wrap_content"
21. android:paddingRight="10px" />
22.
23. <TextView
24. android:id="@+id/r_text3"
25. android:layout_width="wrap_content"
26. android:layout_height="wrap_content"
27. android:paddingLeft="10px" />
28.
29. </LinearLayout>
1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2. android:layout_width="fill_parent" android:layout_height="fill_parent"
3. android:orientation="horizontal" android:layout_gravity="center_vertical" >
4.
5. <TextView
6. android:id="@+id/r_text0"
7. android:layout_width="wrap_content"
8. android:layout_height="wrap_content"
9. android:paddingRight="10px" />
10.
11. <TextView
12. android:id="@+id/r_text1"
13. android:layout_width="wrap_content"
14. android:layout_height="wrap_content"
15. android:paddingRight="10px" />
16.
17. <TextView
18. android:id="@+id/r_text2"
19. android:layout_width="wrap_content"
20. android:layout_height="wrap_content"
21. android:paddingRight="10px" />
22.
23. <TextView
24. android:id="@+id/r_text3"
25. android:layout_width="wrap_content"
26. android:layout_height="wrap_content"
27. android:paddingLeft="10px" />
28.
29. </LinearLayout>
1. public class QueryActivity extends
2. @Override
3. protected void
4. super.onCreate(savedInstanceState);
5. setContentView(R.layout.row);
6. this.setTitle("浏览收藏信息");
7. //实例化数据库帮助类
8. final DBHelper helper = new DBHelper(this);
9. //查询获得游标
10. Cursor c = helper.query();
11. //列表项数组
12. "_id","name","url","desc"};
13. //列表项ID
14. int[] to = {R.id.r_text0,R.id.r_text1,R.id.r_text2,R.id.r_text3};
15. //适配器
16. new SimpleCursorAdapter(this,R.layout.row,c,from,to);
17. //列表视图
18. ListView listView = getListView();
19. //为列表视图添加适配器
20. listView.setAdapter(adapter);
21. //提示对话框
22. final AlertDialog.Builder builder = new AlertDialog.Builder(this);
23. //为ListView设置单击监听器
24. new
25. @Override
26. public void onItemClick(AdapterView<?> arg0, View arg1, int
27. long
28. final long
29. "真的要删除该记录吗?").setPositiveButton("是", new
30. @Override
31. public void onClick(DialogInterface dialog, int
32. //删除数据
33. int)temp);
34. //重新查询
35. Cursor c = helper.query();
36. "_id","name","url","desc"};
37. int[] to = {R.id.r_text0,R.id.r_text1,R.id.r_text2,R.id.r_text3};
38. newSimpleCursorAdapter(getApplicationContext(),R.layout.row,c,from,to);
39. ListView listView = getListView();
40. listView.setAdapter(adapter);
41. }
42. "否", new
43. @Override
44. public void onClick(DialogInterface dialog, int
45.
46. }
47. });
48. //创建提示对话框
49. AlertDialog ad = builder.create();
50. ad.show();
51. }
52. });
53. helper.close();
1. }
1. }
1.