• 轻量数据库SQLiteDataBase的相关操作方法


    一、查询操作:

    查询操作比较复杂,主要有如下操作:

    1 db.rawQuery(String sql, String[] selectionArgs);  
    2 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy);  
    3 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);  
    4 db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); 

    1、最为简单,将所有的SQL语句组织到一个字符串中,selectionArgs就是占位符实际参数集

    2、columns表示要查询的列所有名称集,selection表示WHERE之后的条件语句,可以使用占位符,groupBy指定分组的列名,having指定分组条件,配合groupBy使用,orderBy指定排序的列名

    3、limit指定分页参数

    4、distinct可以指定“true”或“false”表示要不要过滤重复值。

    selection、groupBy、having、orderBy、limit这几个参数中不包括“WHERE”、“GROUP BY”、“HAVING”、“ORDER BY”、“LIMIT”等SQL关键字。
    返回一个Cursor对象,代表数据集的游标,有点类似于JavaSE中的ResultSet。

    Cursor对象的常用方法:

     1 cursor.move(int offset); //以当前位置为参考,移动到指定行  
     2 cursor.moveToFirst();    //移动到第一行  
     3 cursor.moveToLast();     //移动到最后一行  
     4 cursor.moveToPosition(int position); //移动到指定行  
     5 cursor.moveToPrevious(); //移动到前一行  
     6 cursor.moveToNext();     //移动到下一行  
     7 cursor.isFirst();        //是否指向第一条  
     8 cursor.isLast();     //是否指向最后一条  
     9 cursor.isBeforeFirst();  //是否指向第一条之前  
    10 cursor.isAfterLast();    //是否指向最后一条之后  
    11 cursor.isNull(int columnIndex);  //指定列是否为空(列基数为0)  
    12 cursor.isClosed();       //游标是否已关闭  
    13 cursor.getCount();       //总数据项数  
    14 cursor.getPosition();    //返回当前游标所指向的行数  
    15 cursor.getColumnIndex(String columnName);//返回某列名对应的列索引值  
    16 cursor.getString(int columnIndex);   //返回当前行指定列的值 

    二、添加、更新和删除

    1    db.executeSQL(String sql);  
    2    db.executeSQL(String sql, Object[] bindArgs);//sql语句中使用占位符,然后第二个参数是实际的参数集  
    3 
    4 
    5     db.insert(String table, String nullColumnHack, ContentValues values);  
    6     db.update(String table, Contentvalues values, String whereClause, String whereArgs);  
    7     db.delete(String table, String whereClause, String whereArgs);  

    Insert:

    table第一个参数表示操作表名;insert中的第二个参数表示如果插入的数据每一列都为空的话,需要指定此行中某一列的名称,系统将此列设置为NULL,不至于出现错误;insert中的第三个参数是ContentValues类型的变量,是一组键值对组成,Columnkey代表列名,ColumnValue代表该列要插入的值;
    Update:

    update的第二个参数也很类似,只不过它是更新该字段key为最新的value值,第三个参数whereClause表示WHERE表达式,比如“age > ? and age < ?”等,whereArgs参数是占位符的实际参数值;

    delete:

    其参数基本一样。

    三、具体实例:

     1         //打开或创建test.db数据库  
     2         SQLiteDatabase db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);  
     3         db.execSQL("DROP TABLE IF EXISTS person");  
     4         //创建person表  
     5         db.execSQL("CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age SMALLINT)");  
     6         Person person = new Person();  
     7         person.name = "john";  
     8         person.age = 30;  
     9         //插入数据  
    10         db.execSQL("INSERT INTO person VALUES (NULL, ?, ?)", new Object[]{person.name, person.age});  
    11           
    12         person.name = "david";  
    13         person.age = 33;  
    14         //ContentValues以键值对的形式存放数据  
    15         ContentValues cv = new ContentValues();  
    16         cv.put("name", person.name);  
    17         cv.put("age", person.age);  
    18         //插入ContentValues中的数据  
    19         db.insert("person", null, cv);  
    20           
    21         cv = new ContentValues();  
    22         cv.put("age", 35);  
    23         //更新数据  
    24         db.update("person", cv, "name = ?", new String[]{"john"});  
    25           
    26         Cursor c = db.rawQuery("SELECT * FROM person WHERE age >= ?", new String[]{"33"});  
    27         while (c.moveToNext()) {  
    28             int _id = c.getInt(c.getColumnIndex("_id"));  
    29             String name = c.getString(c.getColumnIndex("name"));  
    30             int age = c.getInt(c.getColumnIndex("age"));  
    31             Log.i("db", "_id=>" + _id + ", name=>" + name + ", age=>" + age);  
    32         }  
    33         c.close();  
    34           
    35         //删除数据  
    36         db.delete("person", "age < ?", new String[]{"35"});  
    37           
    38         //关闭当前数据库  
    39         db.close();  
    40           
    41         //删除test.db数据库  
    42 //      deleteDatabase("test.db");  
    43     }  

    四、SQLiteOpenHelper

    SQLiteOpenHelper是SQLiteDatabse的一个帮助类,用来管理数据的创建和版本更新。一般的用法是定义一个类继承SQLiteOpenHelper,并实现两个回调方法,OnCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabse, int oldVersion, int newVersion)来创建和更新数据库。

    一般可以如下获取帮助类的实例:  mOpenHelper = new DatabaseHelper(getContext());

    他有如下三个类定义:

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

    public SQLiteOpenHelper(Context context, String name, int version)

    public SQLiteOpenHelper(Context context)

    二个回调函数:

    public void onCreate(SQLiteDatabase db)

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

    //获取SQLiteDatabase实例

    SQLiteDatabase db = getWritableDatabase(); 

    SQLiteDatabase db = getReadableDatabase();

     五、事务处理

    SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。

    事务处理应用:很多时候我们需要批量的向Sqlite中插入大量数据时,单独的使用添加方法导致应用响应缓慢, 因为sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。为了保证数据的一致性,避免出现数据缺失等情况。

     

     1 SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
     2 //开启事务
     3 db.beginTransaction();
     4 try{
     5             //批量处理操作
     6             //do something
     7            db.execSQL("SQL语句", new Object[]{});
     8            db.execSQL("SQL语句", new Object[]{});
     9             //设置事务标志为成功,当结束事务时就会提交事务
    10             db.setTransactionSuccessful();
    11 }
    12 catch(Exception e){
    13 }
    14 finally{
    15            //结束事务
    16           db.endTransaction();
    17 }

     

     

     

    注:以上代码参考:

    http://blog.csdn.net/li12412414/article/details/51958774

    http://blog.csdn.net/xiaanming/article/details/8679521

  • 相关阅读:
    JavaScript是单线程的
    JavaScript异步
    对象和文本间的转换
    json注意事项
    什么是 JSON?
    定义 Teacher() 构造器函数
    给每一个缩略图添加点击处理器
    新的事件触发机制被定义在 Document Object Model (DOM) Level 2 Events Specification,
    事件在浏览器窗口中
    在代码中做决定 — 条件在任何程序语言中
  • 原文地址:https://www.cnblogs.com/gszw/p/7705339.html
走看看 - 开发者的网上家园