Android 数据库编程基础
http://huanghaijun.iteye.com/blog/653440
Android数据库之SQLite数据库http://www.cnblogs.com/kgb250/archive/2012/08/28/sqlitedatabase.html
Android中SQLite应用详解http://blog.csdn.net/liuhe688/article/details/6715983
原文地址:
http://www.eoeandroid.com/viewthread.php?tid=391&extra=page%3D8%26amp%3Borderby%3Ddateline
SQLite数据库
在某些情况下,文件不是有效的
Ø如果多线程数据访问是相关的
Ø如果应用程序处理可能变化的复杂数据结构
Ø等等
因此,Android带来了内置SQLite数据库支持
数据库对于创建它们的包套件是私有的
数据库不应该用来存贮文件
提示:在SDK中的samples/NotePad下可以找到关于如何使用数据库的例子
SQLite是一个轻量级的软件库
实现了一个完全适应严峻环境的数据库
Ø原子量性
Ø坚固性
Ø独立性
Ø耐久性
体积大小只用几千字节
一些SQL的指令只是部分支持,例如:ALTER、TABLE
参阅http://www.sqlite.org获取更多信息
创建数据库
Context.createDatabase(String name,int version ,int mode,CursorFactory factory)创建一个新的数据库并返回一个SQLiteDatabase对象
假如数据库不能被创建,则抛出FileNotFoundException异常
新创建SQLite数据库方法
SQLiteDatabase myDataBase=this.openOrCreateDatabase("myDataBase.db", MODE_PRIVATE, new CursorFactory(){ //创建新的数据库,名称myDatabase,模式MODE_PRIVATE,鼠标工厂 //工厂类,一个可选工厂类,当查询时调用来实例化一个光标 @Override public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) { // TODO Auto-generated method stub return null; } });
注意,如果没有修改这个Factory的代码,那么干脆给一个null来带地Factory,否则无法创建表等信息。
可以使用SQLiteDatabase的静态方法openOrCreateDatabase(Stringpath,SQLiteDatabae.CursorFactoryfactory)打开或者创建一个数据库,该方法的第一个参数是数据库的创建路径,注意这个路径一定是数据库的全路径。例如/data/data/package/databases/dbname.db。第二个参数是指定返回一个Cursor子类的工厂,如果没有指定(null)则使用默认工厂。
删除数据库
Context.deleteDatabase(String name)删除指定名称的数据库
假如数据库成功删除则返回true,失败则为false(例如数据库不存在)
打开数据库
Context.openDatabase(String file,CursorFactory factory)打开一个存在的数据库并返回一个SQLiteDatabase对象
如果数据库不存在则抛出FileNotFoundException异常
//创建一个名为:myDataBase的数据库,后缀为.db SQLiteDatabase my_DataBase=this.openOrCreateDatabase("myDateBase.db", MODE_PRIVATE, null); my_DataBase.close();//不要忘记关闭数据库
非查询SQL指令
SQLiteDatabase.execSQL(Stringsql)可以用来执行非查询SQL指令,这些指令没有结果
包括:CREATETABLE/DROPTABLE/INSERT等等
例如:
创建一个名为"test"并带两个参数的表
//创建一个名为"test"并带两个参数的表 my_DataBase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, someNumber INTERGER);");
2.在数据库中插入一个元组
//在数据库中插入一个元组 my_DataBase.execSQL("INSERT INTO test (_id,someNumber) values(1,8);");
3.删除表
//删除表 my_DataBase.execSQL("DROP TABLE test");
查询SQL指令-游标Cursors
Android使用游标(Cursors)来导航浏览查询结果
游标(Cursors)被android.database.Cursor对象来描述
一个游标(Cursors)是一个简单的指针,它从查询结果的一个元组跳到下一个元组(或是前一个或是第一个或是……)
游标(Cursors)在它定位位置的那一刻返回元组数据
//为了创建一个Cursor(游标),必须执行一个查询,要么通过SQL使用rawQuery()方法 //或是更精心设计的方法,像query()方法 Cursor cur=my_DataBase.rawQuery("SELECT * FORM test", null); if(cur!=null){//游标不为空 //返回给定名称的列的基于0开始的index,如果该属性列不存在则返回-1 //通过它们的index来检索属性值 int numColumn=cur.getColumnIndex("someNumber"); if(cur.moveToFirst()){ //cur.moveToFirst()让游标指向第一行,如果游标指向第一行,则返回true do { int num=cur.getInt(numColumn);//获得当前行该属性的值 /*Cursor提供了不同的方法来回索不同的数据类型 例如getInt(int index)/getString(int index)等等*/ /*做一些事情*/ } while (cur.moveToNext()); /*游标移动到下一行,如果游标已经通过了结果集中的最后, 即没有行可以移动时,则返回false*/ //其他可能移动的是 previous() 和first()方法 }
数据库应用示例
部分代码
把新输入的联系人信息加入到数据库
//把新输入的联系人信息加入到数据库 private void addToDataBase(String name_str2, String phone_str2, String email_str2, String address_str2) { // TODO Auto-generated method stub String sqlCmd="INSERT INTO myPhoneBook(Pname,Pphone,Pemail,Paddress) values('"+name_str2+"','"+phone_str2+"','"+email_str2+"','"+address_str2+"');"; try { myPhoneBookDB.execSQL(sqlCmd); ShowNoteInformation("添加成功!!"); } catch (Exception e) { // TODO: handle exception ShowNoteInformation("添加失败,记录已经存在!!"); } Log.i("MYTEST", sqlCmd); }
数据库查找联系人信息
setMainScreen(R.layout.persionlist); setActionListener(R.layout.persionlist); //实例化ArrayList arraylistmap=new ArrayList<Map<String,Object>>(); ShowNoteInformation("查看电话"); //为了创建一个Cursor(游标),必须执行一个查询,要么通过SQL使用rawQuery()方法 //或是更精心设计的方法,像query()方法 myCursor=myPhoneBookDB.rawQuery("SELECT * FROM myPhoneBook", null); if(myCursor!=null){//游标不为空 //返回给定名称的列的基于0开始的index,如果该属性列不存在则返回-1 //通过它们的index来检索属性值 int numColumn_name=myCursor.getColumnIndex("name"); int numColumn_phone=myCursor.getColumnIndex("phone"); int numColumn_email=myCursor.getColumnIndex("email"); int numColumn_address=myCursor.getColumnIndex("address"); if(myCursor.moveToFirst()){ //cur.moveToFirst()让游标指向第一行,如果游标指向第一行,则返回true do { //获得当前行该属性的值 /*Cursor提供了不同的方法来回索不同的数据类型 例如getInt(int index)/getString(int index)等等*/ my_name = myCursor.getString(numColumn_name); my_phone = myCursor.getString(numColumn_phone); my_email = myCursor.getString(numColumn_email); my_address = myCursor.getString(numColumn_address); myMap =new HashMap<String, Object>(); myMap.put("Name",my_name ); myMap.put("hone",my_phone ); myMap.put("Email",my_email ); myMap.put("Address",my_address ); arraylistmap.add(myMap); /*做一些事情*/ } while (myCursor.moveToNext()); /*游标移动到下一行,如果游标已经通过了结果集中的最后, 即没有行可以移动时,则返回false*/ //其他可能移动的是 previous() 和first()方法 } } adapter=new SimpleAdapter(this, arraylistmap, android.R.layout.simple_list_item_1, new String[]{"Name"}, new int []{android.R.id.text1}); mylist.setAdapter(adapter);
数据库中删除该电话记录
ShowNoteInformation("删除该电话记录"); myPhoneBookDB.execSQL("DELETE FROM myPhoneBook WHERE Pname='"+my_name+"';"); Log.i("MYTEST", "DELETE FROM myPhoneBook WHERE Pname='"+my_name+"';"); cleanShow();