zoukankan      html  css  js  c++  java
  • Android 数据存储03之SQLite

     

    SQLite数据存储

    Android 集成了 SQLite 数据库。它存储在 /data/data/< 项目文件夹 >/databases/ 下。Android 开发中使用 SQLite 数据库 Activites 可以通过 Content Provider 或者 Service 访问一个数据库。

    Android数据库中主要涉及到的类有:SQLiteOpenHelper、SQLiteDatabase、Cursor、Context。

    (01)SQLiteOpenHelper:它是 SQLiteDatabase的辅助类,主要功能是辅助管理数据库,如管理数据库的创建和版本。

    (02)SQLiteDatabase:它是Android SQLite的核心类,包括的内容主要有,数据库表格的创建、删除,数据的添加、更新、删除,数据的查找等。

    (03)Cursor:游标。当需要查找数据库的时候,会用到游标;通过Cursor可以对查找的结果进行方便的操作。

    (04)Context:上下文环境。它提供了简单的打开/关闭数据库的接口。

    也就是说,我们可以通过SQLiteOpenHelper或Context,来创建/打开数据;然后通过SQLiteDatabase的接口对数据库的值进行操作;需要对数据库进行查找时,便会用到Cursor。

    下面分别对它们进行简单的介绍

    1 SQLiteOpenHelper

    它是SQLiteDatabase的辅助类,有两个功能:第一,用来管理SQLite数据库的创建和版本。第二,当创建/打开/升级数据库时,可以实现相应的回调函数响应一定的动作。

    继承SQLiteOpenHelper的话,需要实现3个方法:

    第一,构造函数。并要求在构造函数中调用父类的构造函数

    第二,onCreate(SQLiteDatabase)。这是创建数据库的回调函数。

    onUpgrade(SQLiteDatabase,int, int)。这是升级数据库的回调函数。

    至于onOpen(SQLiteDatabase)方法,可以根据自己的意愿,选择是否覆盖。

    1.1SQLiteOpenHelper构造函数

    有如下两个构造函数

    public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

    public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler)第一个参数:Context类型,上下文对象。 第二个参数:String类型,数据库的名称 第三个参数:CursorFactory类型 第四个参数:int类型,数据库版本 

    第五个参数:DatabaseErrorHandler类型,数据库错误回调函数。

    1.2 SQLiteOpenHelper常用API

    1.3 SQLiteOpenHelper实例

    HelloAndroid.java

    package com.yarin.Android.HelloAndroid;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.ContentValues;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper; 
    import android.database.sqlite.SQLiteDatabase.CursorFactory; 
    import android.os.Bundle;
    import android.widget.Button;
    import android.util.Log; 
    
    public class HelloAndroid extends Activity {
        private static final String TAG = "skywang-->HelloAndroid";
        private static final String DB_NAME = "skywang_SQLiteOpenHelper_db";
        private static final int VERSION = 1;
        
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            // 创建数据库
            DatabaseHelper dbHelper = new DatabaseHelper(this, DB_NAME, null, VERSION);
    
            Log.d(TAG, "before call getReadableDatabase()"); 
    
            // 只有调用了getWritableDatabase()方法或者getReadableDatabase()方法之后,才会创建或打开一个连接
            // 即,才会调用onCreate()
            SQLiteDatabase db = dbHelper.getReadableDatabase(); 
    
            Log.d(TAG, "dabase name="+dbHelper.getDatabaseName());
            dbHelper.close();
        }
    
        // SQLiteOpenHelper是一个辅助类,用来管理数据库的创建和版本他
        public class DatabaseHelper extends SQLiteOpenHelper {
    
            public DatabaseHelper(Context context, String name, CursorFactory factory,
                    int version) {
                //必须通过super调用父类当中的构造函数
                super(context, name, factory, version);
    
                Log.d(TAG, "call databaseHelper constructor");
            }
    
            @Override
            public void onCreate(SQLiteDatabase db) {
                Log.d(TAG, "call database onCreate");
            }
    
            @Override
            public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
                Log.d(TAG, "call database onUpgrade");
            }
    
            @Override
            public void onOpen(SQLiteDatabase db) {
                Log.d(TAG, "call database onOpen");
            }
        }
    }


    打印结果如下:

    D/skywang-->HelloAndroid(2712): call database onCreate

    D/skywang-->HelloAndroid(2712): call database onOpen

    D/skywang-->HelloAndroid(2712): dabase name=skywang_SQLiteOpenHelper_db

    2 SQLiteDatabase

    参考“3.2 Cursor实例

    3Cursor

    3.1 Cursor说明

    3.2 Cursor实例

    HelloAndroid.java

    package com.yarin.Android.HelloAndroid;
    
    importandroid.app.Activity;
    importandroid.content.Context;
    importandroid.content.ContentValues;
    importandroid.database.Cursor;
    importandroid.database.sqlite.SQLiteDatabase;
    importandroid.database.sqlite.SQLiteOpenHelper; 
    importandroid.database.sqlite.SQLiteDatabase.CursorFactory; 
    importandroid.os.Bundle;
    importandroid.view.View;
    importandroid.view.View.OnClickListener;
    importandroid.widget.Button;
    importandroid.util.Log;
     
    public classHelloAndroid extends Activity {
        private static final String TAG ="skywang-->HelloAndroid";
     
        private static final String DB_NAME ="skywang_SQLiteOpenHelper_db";
        private static final int VERSION_01 = 1;
        private static final int VERSION_02 = 1;
     
        private static final String TABLE_NAME ="person";
        private static final String ATTR_ID ="id";
        private static final String ATTR_NAME ="name";
        private DatabaseHelper dbHelper = null;
        private SQLiteDatabase db = null;
        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
     
            // 创建数据库
            dbHelper = new DatabaseHelper(this,DB_NAME, null, VERSION_01);
     
            // 获取数据库对象
            db = dbHelper.getWritableDatabase();
     
            //创建表 
           //db.execSQL("CREATE TABLE IF NOTEXISTS person(id INTEGER PRIMARY KEY AUTOINCREMENT,name varchar(20))");
            db.execSQL("CREATE TABLE IF NOTEXISTS "
                    +TABLE_NAME+" ( "
                    +ATTR_ID+" INTEGER PRIMARYKEY AUTOINCREMENT, "
                    +ATTR_NAME +"varchar(20))");
     
            // 插入数据(方法一)
            // INSERT INTO person (id, name) VALUES(20130225, 'anybody')
            /*
            db.execSQL("INSERT INTO " 
                    + TABLE_NAME +"(" 
                    + ATTR_ID + "," 
                    + ATTR_NAME+ ") VALUES" 
                    + "(20130225,'anybody')");
                    //*/
            db.execSQL("INSERT INTO " 
                    + TABLE_NAME + " VALUES" 
                    + "(20130225,'anybody')");
            printDatabase() ;
      
            // 插入数据(方法二)
            // 创建ContentValues对象
            ContentValues values = new ContentValues();
            values.put(ATTR_ID, 598435460);
            values.put(ATTR_NAME,"skywang");
            // 调用insert方法,就可以将数据插入到数据库当中
            // 第一个参数:表名称
            // 第二个参数:SQl不允许一个空列,如果ContentValues是空的,那么这一列被明确的指明为NULL值
            // 第三个参数:ContentValues对象
            db.insert(TABLE_NAME, null, values);
            printDatabase() ;
     
            // 更新数据(方法一)
            //UPDATE Person SET Address = 'Zhongshan23', City = 'Nanjing'
            //  WHERELastName = 'Wilson'
            db.execSQL("UPDATE "
                    + TABLE_NAME + " SET" 
                    + ATTR_NAME+ " = 'nobody'WHERE "
                    + ATTR_ID + " =20130225"); 
            printDatabase() ;
                  
            // 更新数据(方法二)
            // update()方法有四个参数,分别是表名,表示列名和值的 ContentValues 对象,可选的 WHERE 条件和可选的填充 WHERE 语句的字符串,这些字符串会替换 WHERE 条件中的“?”标记
            values = new ContentValues();
            String[] attStr = new String[]{"598435460"};
            values.put(ATTR_NAME,"ghost_walker");
            db.update(TABLE_NAME, values,ATTR_ID+"=?", attStr);
            printDatabase() ;
      
            printNobody() ;
      
            // 删除数据(方法一)
            // DELETE FROM person WHERE id =20130225
            db.execSQL("DELETE FROM "
                    +TABLE_NAME + " WHERE "
                    + ATTR_ID + " =20130225"); 
            printDatabase() ;
      
            // 删除数据(方法二)
            String[] args = newString[]{"598435460"};
            db.delete(TABLE_NAME,ATTR_ID+"=?", args);
            printDatabase() ;
      
            Log.d(TAG, " delete all things inthe table.");
            // 删除表格内的全部数据
            db.delete(TABLE_NAME,null,null);
            //db.execSQL("DELETE * FROM "+TABLE_NAME);
            printDatabase() ;
        }
      
        @Override
        public void onDestroy() {
            super.onDestroy();
            if (dbHelper != null)
                dbHelper.close();
        }
      
        // 打印出数据库的全部数据
        private void printDatabase() {
            // SELECT * FROM person
            Cursor c = db.rawQuery("SELECT *FROM " + TABLE_NAME, null); 
            Log.d(TAG, "===printdatabase===");
            while(c.moveToNext()) {
                int index = c.getPosition();
                int id =c.getInt(c.getColumnIndex(ATTR_ID)); 
                String name =c.getString(c.getColumnIndex(ATTR_NAME)); 
               
                Log.d(TAG,"line-"+index+" : "+"id="+id+",name="+name);
            }
        }
      
        // 查找name=nobody,并打印出结果
        private void printNobody() {
            // query方法一
            // 说明:字符串需要用单引号(')括起来
            // SELECT id, name FROM person WHEREname='nobody'
            Cursor c = db.rawQuery("SELECT"
                 + ATTR_ID + " , "
                 + ATTR_NAME + " FROM "
                 + TABLE_NAME + " WHERE "
                 + ATTR_NAME + "='nobody'", null); 
            while(c.moveToNext()) {
                int id =c.getInt(c.getColumnIndex(ATTR_ID)); 
                String name =c.getString(c.getColumnIndex(ATTR_NAME)); 
                Log.d(TAG, "Method-01-->thenobody has been found: id="+id+", name="+name);
            }
      
            // query方法二
            String[] columns=new String[]{ATTR_ID,ATTR_NAME};
            String[] parms=newString[]{"nobody"};
            c=db.query(TABLE_NAME, columns,ATTR_NAME+"=?",parms, null, null, null);
            while(c.moveToNext()) {
                int id =c.getInt(c.getColumnIndex(ATTR_ID)); 
               String name = c.getString(c.getColumnIndex(ATTR_NAME)); 
                Log.d(TAG, "Method-02-->thenobody has been found: id="+id+", name="+name);
            }
        }
      
        public class DatabaseHelper extendsSQLiteOpenHelper {
      
            public DatabaseHelper(Context context,String name, CursorFactory factory,
                    int version) {
                //必须通过super调用父类当中的构造函数
                super(context, name, factory,version);
                Log.d(TAG, "call databaseHelperconstructor");
            }
      
            @Override
            public void onCreate(SQLiteDatabase db){
            }
      
            @Override
            public void onUpgrade(SQLiteDatabasearg0, int arg1, int arg2) {
            }
        } 
     
    }

    打印结果如下:

    D/skywang-->HelloAndroid(2661): ===print database===

    D/skywang-->HelloAndroid(2661): line-0 : id=20130225, name=anybody

    D/skywang-->HelloAndroid(2661): ===print database===

    D/skywang-->HelloAndroid(2661): line-0 : id=20130225, name=anybody

    D/skywang-->HelloAndroid(2661): line-1 : id=598435460, name=skywang

    D/skywang-->HelloAndroid(2661): ===print database===

    D/skywang-->HelloAndroid(2661): line-0 : id=20130225, name=nobody

    D/skywang-->HelloAndroid(2661): line-1 : id=598435460, name=skywang

    D/skywang-->HelloAndroid(2661): ===print database===

    D/skywang-->HelloAndroid(2661): line-0 : id=20130225, name=nobody

    D/skywang-->HelloAndroid(2661): line-1 : id=598435460, name=ghost_walker

    D/skywang-->HelloAndroid(2661): Method-01-->the nobody has been found: id=20130225, name=nobody

    D/skywang-->HelloAndroid(2661): Method-02-->the nobody has been found: id=20130225, name=nobody

    D/skywang-->HelloAndroid(2661): ===print database===

    D/skywang-->HelloAndroid(2661): line-0 : id=598435460, name=ghost_walker

    D/skywang-->HelloAndroid(2661): ===print database===

    D/skywang-->HelloAndroid(2661):  delete all things in the table.

    D/skywang-->HelloAndroid(2661): ===print database===

      

    4Context

    4.1Context自带的database接口

     参考文献:

    1, Android API文档

    2,Android实现数据存储技术:http://www.cnblogs.com/hanyonglu/archive/2012/03/01/2374894.html


  • 相关阅读:
    Bootstrap 网页1
    Bootstrap 网页实例
    Bootstrap 警告框
    Bootstrap 表格
    Bootstrap 小功能
    【BZOJ1706】[usaco2007 Nov]relays 奶牛接力跑 矩阵乘法
    【BZOJ3669】[Noi2014]魔法森林 LCT
    【BZOJ2049,2631,3282,1180】LCT模板四连A
    【BZOJ4071】[Apio2015]巴邻旁之桥 Treap
    【BZOJ1009】[HNOI2008]GT考试 next数组+矩阵乘法
  • 原文地址:https://www.cnblogs.com/skywang12345/p/2936042.html
Copyright © 2011-2022 走看看