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();

相关推荐