0
点赞
收藏
分享

微信扫一扫

Android 数据库编程基础

 

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



[color=red]注意,如果没有修改这个Factory的代码,那么干脆给一个null来带地Factory,否则无法创建表等信息[/color]。


可以使用SQLiteDatabase的静态方法openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)打开或者创建一个数据库,该方法的[color=red]第一个参数是数据库的创建路径,注意这个路径一定是数据库的全路径。例如/data/data/package/databases/dbname.db。第二个参数是指定返回一个Cursor子类的工厂,如果没有指定(null)则使用默认工厂。[/color]




删除数据库



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

举报

相关推荐

0 条评论