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