zoukankan      html  css  js  c++  java
  • 关于sqlite的数据库操作

    sqlite是Android上使用的一种轻量级数据库,sqlite本身是一个开源的小型数据库,它占用空间小,资源少,适用于各种嵌入式设备、移动终端等;

     
    如何打开/创建一个数据库
     
    //打开或创建test.db数据库  
    SQLiteDatabase db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);  
     
    这样就可以在test.db没有的情况下,创建test.db,在已经存在的情况下,会打开这个数据库;数据库默认的生成路径为:
    /data/data/[PACKAGE_NAME]/databases
     
     
    可以通过 
    db.execSQL(String);
    db.execSQL(String sql, String[] sqlArgs);
     
    来执行sql语句;
    除了上面的方式执行sql以外,还可以通过insert方法插入数据:

    db.insert(String table, String nullColumnHack, ContentValues values);
     
    通过下面方法更新数据:
    db.update(String table, ContentValues values, String whereClause, String[] whereArgs) ;
     
    通过delete 方法来删除数据;
    int delete (String table, String whereClause, String[] whereArgs) ;
     
    其中 ContentValues  是一个键值对数据结构,用法与HashMap类似;
     
    ContentValues cv = new ContentValues();  
    cv.put("name", person.name);  
    cv.put("age", person.age);  
     
     
    查询方法:
    public Cursor rawQuery (String sql, String[] selectionArgs) ;
    public Cursor query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) ;
    public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) ;
    public Cursorquery(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) ;
     
    第一种方法是直接通过sql语句来查询,其他几种是指定表名,字段,等等进行的查询;
     
    每种方式都返回Cursor对象,指向的是数据库数据;
    Cursor对象的主要用法
     
    c.move(int offset); //以当前位置为参考,移动到指定行  
    c.moveToFirst();    //移动到第一行  
    c.moveToLast();     //移动到最后一行  
    c.moveToPosition(int position); //移动到指定行  
    c.moveToPrevious(); //移动到前一行  
    c.moveToNext();     //移动到下一行  
    c.isFirst();        //是否指向第一条  
    c.isLast();     //是否指向最后一条  
    c.isBeforeFirst();  //是否指向第一条之前  
    c.isAfterLast();    //是否指向最后一条之后  
    c.isNull(int columnIndex);  //指定列是否为空(列基数为0)  
    c.isClosed();       //游标是否已关闭  
    c.getCount();       //总数据项数  
    c.getPosition();    //返回当前游标所指向的行数  
    c.getColumnIndex(String columnName);//返回某列名对应的列索引值  
    c.getString(int columnIndex);   //返回当前行指定列的值  
     
    最后我们调用db.close(); 关闭数据库;
     
    一般来说,我们不会让我们的上层业务代码直接使用原生的 SQLiteDatabase来进行数据库操作,而是通过继承SQLiteOpenHelper扩展一个类,用于进行相关的数据库操作;
    通常来说,我们继承 SQLiteOpenHelper 的时候,需要实现 onCreate 和 onUpgrade 两个函数;
    例如我们继承一个SQLiteOpenHelper类
     
    public class DBHelper extends SQLiteOpenHelper {  
        private static final String DATABASE_NAME = "test.db";  
        private static final int DATABASE_VERSION = 1;  
     
        public DBHelper(Context context) {  
            //CursorFactory设置为null,使用默认值  
            super(context, DATABASE_NAME, null, DATABASE_VERSION);  
        }  
     
        //数据库第一次被创建时onCreate会被调用  
        @Override  
        public void onCreate(SQLiteDatabase db) {  
            db.execSQL("CREATE TABLE IF NOT EXISTS person" +  
                    "(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER, info TEXT)");  
        }  
     
        //如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade  
        @Override  
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
            db.execSQL("ALTER TABLE person ADD COLUMN other STRING");  
        }  
    }  
     
    针对于onCreate应该都知道了,就是数据库第一次被创建的时候被调用;
    onUpgrade会在什么时候被调用呢?
    因为在 SQLiteOpenHelper里面,构造函数:
    public SQLiteOpenHelper (Context context, String name, SQLiteDatabase.CursorFactory factory, int version) ;
     
    每次调用 该构造函数的时候,都会传入 version ,SQLiteHelper如果防线version与原有version不一致的时候,就会在调用原来创建数据库onCreate的地方改为去调用onUpgrade函数,这个时候,我们只需要在更新的apk的代码里面,增加对应的数据库DDL和DML的变更就可以了;
     
    一般来说,我们使用Helper的方式是这样的;
    SQLiteDatabase db = helper.getWritableDatabase();
     
    通过 getWritableDatabase 函数,使得首次创建的时候SQLiteHelper的onCreate函数被调用到,从而使得数据库被创建;如果是数据库升级的话,则onUpgrade会被调用到;
    这样的话,我们将上面使用Helper的代码给封装起来,放在某个数据库操作类中,供业务层调用就可以了;
     
     
    上面的内容,主要是学习了  http://blog.csdn.net/liuhe688/article/details/6715983 这篇文章;
     
     
     
     
  • 相关阅读:
    jquery动画,获取,添加
    javac3p0连接池
    jquery尺寸
    jquery遍历
    jquery删除,停止,获取设置css,设置内容和属性,过滤
    javajdbc(数据库的添加,删除,修改,更新)
    博客开通
    很久每有来空来了,一些最近的想法
    竖线的显示
    一个小问题,c++
  • 原文地址:https://www.cnblogs.com/coldforce/p/4993385.html
Copyright © 2011-2022 走看看