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(String path,SQLiteDatabae.CursorFactory factory)打开或者创建一个数据库,该方法的
第一个参数是数据库的创建路径,注意这个路径一定是数据库的全路径。例如/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(String sql)可以用来执行非查询SQL指令,这些指令没有结果
包括:CREATE TABLE / DROP TABLE / 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();