 | Android 数据库编程基础 ... by 机器人 ... 20 月 6 天前 ... 322 次点击
本帖最后由 地狱怒兽 于 2009-6-2 02:01 编辑
数据库编程基础
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;
? ?? ?? ?? ?}
});复制代码删除数据库
Context.deleteDatabase(String name)删除指定名称的数据库
假如数据库成功删除则返回true,失败则为false(例如数据库不存在)
? ?? ???//删除指定名称的数据库
? ?? ???this.deleteDatabase("myDatabase.db");复制代码打开数据库
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);");复制代码
在数据库中插入一个元组//在数据库中插入一个元组
my_DataBase.execSQL("INSERT INTO test (_id,someNumber) values(1,8);");复制代码删除表//删除表
my_DataBase.execSQL("DROP TABLE test");复制代码
查询SQL指令-游标Cursors
Android 使用游标(Cursors)来导航浏览查询结果游标(Cursors)被android.database.Cursor对象来描述
一个游标(Cursors)是一个简单的指针,它从查询结果的一个元组跳到下一个元组(或是前一个或是第一个或是……)游标(Cursors)在它定位位置的那一刻返回元组数据
表 test_idsomeNumber1821032
? ?? ???//为了创建一个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();复制代码运行结果 | |