android sqlite (上)

首先,说一下SQLite的概念:

SQLite 是一个开源的嵌入式关系数据库,它可以减少应用程序管理数据的开销 , SQLite 可移植性好 、 很容易使用 、 很小 、 高效而且可靠 。目前在Android 系统中集成的是 SQLite3 版本 ,SQLite 不支持静态数据类型 , 而是使用列关系 。 这意味着它的数据类型不具有表列属性 , 而具有数据本身的属性 。 当某个值插入数据库时, SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成列类型。如果不能转换,则该值将作为其本身具有的类型存储。SQLite 支持 NULL 、INTEGER 、 REAL 、 TEXT 和 BLOB 数据类型。例如:可以在 Integer 字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。但是有一种例外,如果你的主键是 INTEGER ,那么只能存储 6 4位整数 , 当向这种字段中保存除整数以外的数据时, 将会产生错误 。 另外 , SQLite 在解 析REATE TABLE语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息。

 

SQLite 的特点

SQlite数据库总结起来有五大特点:

1. 零配置

SQlite3不用安装、不用配置、不用启动、关闭或者配置数据库实例。当系统崩溃后不用做任何恢复操作,在下次使用数据库的时候自动恢复。

2. 可移植

它是运行在 Windows 、 Linux 、BSD 、 Mac OS X 和一些商用 Unix 系统, 比如 Sun 的 Solaris 、IBM 的 AIX ,同样,它也可以工作在许多嵌入式操作系统下,比如 Android 、 QNX 、VxWorks、 Palm OS 、 Symbin 和 Windows CE 。

3. 紧凑

SQLite是被设计成轻量级、自包含的。一个头文件、一个 lib 库,你就可以使用关系数据库了,不用任何启动任何系统进程。

4. 简单

SQLite有着简单易用的 API 接口。

5. 可靠

SQLite的源码达到 100% 分支测试覆盖率。

------------------------------------------

要操SQLite,我们需要继承SQLiteOpenHelper,然后通过继承类来获取SQLiteDatabase对象,从而来达到操作SQLite数据

的目标。如果要打开SQLite数据库,可以使用

SQLite.Expert.Professional

来打开,这里附上地址 http://download.csdn.net/detail/draem0507/5311550(如果没有积分的话,可以单独私信或则mail我,我会第一时间发给你的O(∩_∩)O哈!)

创建一个继承类 SQLiteOpenHelper

 SQliteOpenHelper是一个抽象类,来管理数据库的创建和版本的管理。要使用它必须实现它的nCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase, int, int)方法

  onCreate:当数据库第一次被建立的时候被执行,例如创建表,初始化数据等。

  onUpgrade:当数据库需要被更新的时候执行,例如删除久表,创建新表。

  实现代码:

 1 /**
 2  * @author  draem0507@gmail.com
 3  * @TODO    
 4  * @version 1.0
 5  * @date 2013-4-28上午09:37:13    
 6  * myblog:http://www.cnblogs.com/draem0507
 7  */
 8 public class DataBaseHelper extends SQLiteOpenHelper {
 9     private static final String TAG=DataBaseHelper.class.getName();
10     private final static int VERSION=1;
11     private String sql="create table if not exists t_user(id int primary key,name varchar2(100))";
12 
13     //必须要重写
14     public DataBaseHelper(Context context, String name, CursorFactory factory,
15             int version) {
16         
17         super(context, name, factory, version);
18         // TODO Auto-generated constructor stub
19     }
20     
21     public DataBaseHelper(Context context, String name,
22             int version) {
23         this(context, name, null, version);
24         // TODO Auto-generated constructor stub
25     }
26     public DataBaseHelper(Context context, String name) {
27         this(context, name, null, VERSION);
28         // TODO Auto-generated constructor stub
29     }
30     
31 
32     //第一次创建的时候调用
33     @Override
34     public void onCreate(SQLiteDatabase db) {
35         Log.e(TAG, "创建数据库");
36         db.execSQL(sql);
37         
38     }
39     //更新数据库的时候调用
40     @Override
41     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
42         // TODO Auto-generated method stub
43         Log.e(TAG, "更新数据库");
44         
45     }
46 
47 }

 SQLiteDatabase操作数据

接着,我们就要调用这个继承类来进行操作了

Android提供了一个名为SQLiteDatabase的类,它封装了一些操作数据库的API。使用它能实现基本的CRUD操作,通过getWritableDatabase()和getReadableDatabase()可以获取数据库实例。

实现代码

  1 public class SqliteActivity extends Activity {
  2     private Button mcreateBt;
  3     private Button mupdateBt;
  4     private Button minsertBt;
  5     private Button meditBt;
  6     private Button mqueryBt;
  7     private Button mcloseBt;
  8     private DataBaseHelper baseHelper;
  9     private SQLiteDatabase database;
 10     private static final String TAG = SqliteActivity.class.getName();
 11 
 12     /** Called when the activity is first created. */
 13     @Override
 14     public void onCreate(Bundle savedInstanceState) {
 15         super.onCreate(savedInstanceState);
 16         setContentView(R.layout.main);
 17         
 18         mcreateBt = (Button) findViewById(R.id.createBt);
 19         mupdateBt = (Button) findViewById(R.id.updateBt);
 20         minsertBt = (Button) findViewById(R.id.insertBt);
 21         meditBt = (Button) findViewById(R.id.editBt);
 22         mqueryBt = (Button) findViewById(R.id.queryBt);
 23         mcloseBt = (Button) findViewById(R.id.closeBt);
 24 
 25         mcreateBt.setOnClickListener(new BtListener());
 26         mupdateBt.setOnClickListener(new BtListener());
 27         meditBt.setOnClickListener(new BtListener());
 28         minsertBt.setOnClickListener(new BtListener());
 29         mqueryBt.setOnClickListener(new BtListener());
 30         mcloseBt.setOnClickListener(new BtListener());
 31 
 32         // 初始化
 33 
 34     }
 35 
 36     class BtListener implements View.OnClickListener {
 37 
 38         @Override
 39         public void onClick(View v) {
 40             // TODO Auto-generated method stub
 41             int id = v.getId();
 42             //Toast.makeText(SqliteActivity.this, ""+id, 1).show();
 43             switch (id) {
 44             case R.id.createBt:
 45                 Log.e(TAG, "触发创建数据库事件");
 46                 baseHelper = new DataBaseHelper(SqliteActivity.this, "user.db");
 47                 database = baseHelper.getReadableDatabase();
 48                 break;
 49             case R.id.updateBt:
 50                 Log.e(TAG, "触发更新数据库事件");
 51                 baseHelper = new DataBaseHelper(SqliteActivity.this, "user.db", 2);
 52                 database = baseHelper.getReadableDatabase();
 53                 break;
 54             case R.id.insertBt:
 55                 Log.e(TAG, "触发新增数据事件");
 56                 baseHelper = new DataBaseHelper(SqliteActivity.this, "user.db", 2);
 57                 database = baseHelper.getWritableDatabase();
 58                 ContentValues values = new ContentValues();
 59                 values.put("id", "1");
 60                 values.put("name", "draem0507");
 61                 database.insert("t_user", null, values);
 62                 break;
 63             case R.id.editBt:
 64                 Log.e(TAG, "触发修改数据事件");
 65                 baseHelper = new DataBaseHelper(SqliteActivity.this, "user.db", 2);
 66                 database = baseHelper.getWritableDatabase();
 67                 // values = new ContentValues();
 68                 //values.put("name", "lwx");
 69                 //database.update("t_user", values, "id=?", new String []{"1"});
 70                 database.execSQL("update t_user set name=? where id=?", new String[]{"draem0507","1"});
 71                     
 72                 break;
 73             case R.id.queryBt:
 74                 Log.e(TAG, "触发查询数据事件");
 75                 baseHelper = new DataBaseHelper(SqliteActivity.this, "user.db", 2);
 76                 database = baseHelper.getReadableDatabase();
 77                 // 第一个参数String:表名
 78                 // 第二个参数String[]:要查询的列名
 79                 // 第三个参数String:查询条件
 80                 // 第四个参数String[]:查询条件的参数
 81                 // 第五个参数String:对查询的结果进行分组
 82                 // 第六个参数String:对分组的结果进行限制
 83                 // 第七个参数String:对查询的结果进行排序
 84                 Cursor cursor=database.query("t_user", new String[] { "id,name" }, "id=?",
 85                         new String[] { "1" }, null, null, null);
 86                 while (cursor.moveToNext()) {
 87                     //cursor.getString(cursor.getColumnIndex("id"));
 88                     int userId =cursor.getInt(0);
 89                     String name=cursor.getString(1);
 90                     Log.v(TAG, "userId="+userId+"\tname="+name);
 91                     
 92                 }
 93                 break;
 94             case R.id.closeBt:
 95                 Log.e(TAG, "触发关闭数据事件");
 96                 baseHelper = new DataBaseHelper(SqliteActivity.this, "user.db", 2);
 97                 database = baseHelper.getReadableDatabase();
 98                 database.close();
 99                 break;
100 
101             }
102 
103         }
104 
105     }
106 }

这样,我们就可以完成对SQlite的简单的操作。

补充几点:创建好的SQLite数据库文件地址是在data/data/包名/databases/创建的数据库文件

可以使用pull来抽取出数据库文件,然后通过SQLiteExpertPro来打开,并且默认SQLite数据库会有一个android_metadata表。当然也可以通过DDMS的File  Explorer来获取数据库。具体看下面的截图吧

 

如果觉得文章有点错乱,可以看下别人写的 仅供参考

http://www.cnblogs.com/xqhppt/archive/2010/11/01/1866670.html

http://byandby.iteye.com/blog/835580

 

 

 

posted @ 2013-04-28 16:00  draem0507  阅读(1420)  评论(0编辑  收藏  举报
View Code