SQliteDatabase相关操作的工具类 有更新!

  hehaitao074

    (一)、MySQLiteDatabaseHelper类的封装:

    1、public void getConnection();

    /**

    • @作用:执行带占位符的select语句,查询数据,返回Cursor

    • @param sql

    • @param selectionArgs

    • @return Cursor

      */

    2、public Cursor selectCursor(String sql, String[] selectionArgs);

    /**

    • @作用:执行带占位符的select语句,返回结果集的个数

    • @param sql

    • @param selectionArgs

    • @return int

      */

    3、public int selectCount(String sql, String[] selectionArgs);

    /**

    • @作用:执行带占位符的update、insert、delete语句,更新数据库,返回true或false

    • @param sql

    • @param bindArgs

    • @return boolean

      */

    4、public boolean updateData(String sql, String[] bindArgs);

    /**

    • @作用:执行带占位符的select语句,返回多条数据,放进List集合中。

    • @param sql

    • @param selectionArgs

    • @return List>

      */

    5、public List> selectData(String sql,

    String[] selectionArgs);

    /**

    • 作用:将cursor转成list集合

    • @param cursor

    • @return List>

      */

    6、public List> cursorToList(Cursor cursor);

    7、public void closeDb();

    二、SQLiteOpenHelper类:SQLiteDatabase

    (一)、介绍:

    SQLiteOpenHelper是系统提供的一个管理数据库表创建和更新的抽象类,我们必须通过继承SQLiteOpenHelper来实现自己的工具类。 一般我们要重写三个方法,构造器、onCreate方法、onUpgrade方法。

    (二)、SQLiteOpenHelper 类的使用步骤:【重点】

    1. 创建SQLiteOpenHelper类的子类MySQLiteOpenHelper 类,实现SQLiteOpenHelper类中的抽象方法onCreate()和onUpgrade();
    2. 调用 MySQLiteOpenHelper 对象的getWritableDatabase 或 getReadableDatabase方法,获得SQLiteDatabase 对象;
    3. 创建表。实际上是执行DML操作的Create;
    4. 调用SQLiteDatabase 对象的execSQL()方法,执行 update,insert,delete操作;调用rawQuery()方法执行select查询操作;
    5. 如果执行的是查询操作,则对返回的Cursor进一步处理。

    (三)、SQLiteOpenHelper类中常用方法:

    • onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。
    • onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。

    【备注:】除了上述两个必须要实现的方法外,还可以选择性地实现onOpen 方法,该方法会在每次打开数据库时被调用。

    • getWritableDatabase() 创建一个可读写数据库
    • getReadableDatabase() 创建一个可读写数据库

    【备注:】调用getReadableDatabase 方法返回的并不总是只读数据库对象,一般来说该方法和getWriteableDatabase 方法的返回情况相同,只有在数据库仅开放只读权限或磁盘已满时才会返回一个只读的数据库对象。而getWriteableDatabase()方法打开的数据库,一旦数据库磁盘空间满了,就只能读而不能写,如果再写则报错。因此建议使用getReadableDatabase()方法来获打开数据库。

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    
        private static final String DBNAME = "EnglishWords.db";
        private static final int VERSION = 1;
        private SQLiteDatabase db = null;
    
        public MySQLiteOpenHelper(Context context) {
            super(context, DBNAME, null, VERSION);
            getConnection();
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
    
            // db.execSQL("CREATE TABLE englishwords(_id INTEGER PRIMARY KEY AUTOINCREMENT, words,detail)");
    
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            if (newVersion > oldVersion) {
                db.execSQL("DROP TABLE IF EXISTS englishwords");
                onCreate(db);
            }
    
        }
    
        private void getConnection() {
            db = this.getReadableDatabase();
        }
    
        public Cursor selectCursor(String sql, String[] selectionArgs) {
    
            return db.rawQuery(sql, selectionArgs);
    
        }
    
        public int selectCount(String sql, String[] selectionArgs) {
    
            Cursor cursor = db.rawQuery(sql, selectionArgs);
            int count = 0;
            if (cursor != null) {
                count = cursor.getCount();
                cursor.close();
            }
            return count;
    
        }
    
        public List> selectData(String sql,
                String[] selectionArgs) {
            Cursor cursor = db.rawQuery(sql, selectionArgs);
            return cursorToList(cursor);
        }
    
        public List> cursorToList(Cursor cursor) {
    
            List> list = new ArrayList>();
            String[] names = cursor.getColumnNames();
            while (cursor.moveToNext()) {
                Map map = new HashMap();
                for (int i = 0; i < names.length; i++) {
                    switch (cursor.getType(i)) {
                    case Cursor.FIELD_TYPE_INTEGER:
                        map.put(names[i], cursor.getLong(i));
                        break;
                    case Cursor.FIELD_TYPE_FLOAT:
                        map.put(names[i], cursor.getDouble(i));
                        break;
                    case Cursor.FIELD_TYPE_STRING:
                        map.put(names[i], cursor.getString(i));
                        break;
                    case Cursor.FIELD_TYPE_BLOB:
                        map.put(names[i], cursor.getBlob(i));
                        break;
                    default:
                        break;
                    }
                }
                list.add(map);
    
            }
            if (cursor != null) {
                cursor.close();
            }
            return list;
        }
    
        public boolean updateData(String sql, Object[] bindArgs) {
            try {
                db.execSQL(sql, bindArgs);
                return true;
    
            } catch (Exception e) {
    
                return false;
            }
    
        }
    
        public void closeDb() {
            if (db != null) {
                db.close();
    
            }
        }
    
    }
    

    四、CursorAdapter与SimpleCursorAdapter:

    1、类结构:

    java.lang.Object

    ↳ android.widget.BaseAdapter

     ↳ android.widget.CursorAdapter
    

    java.lang.Object

    ↳ android.widget.BaseAdapter

      ↳  android.widget.CursorAdapter
    
         ↳  android.widget.ResourceCursorAdapter
    
            ↳  android.widget.SimpleCursorAdapter
    

    2、描述:

    SimpleCurosrAdapter 是一个将 Cursor 中的 columns 与在 XML 布局文件中定义的 控件进行匹配的简易 adapter。或者说,SimpleCursorAdapter 允许绑定一个 Cursor 的 columns 到 ListView 上,并使用自定义的 layout 显示 List中的每个项目。SimpleCursorAdapter 作为中间桥梁,将从 sqlite 数据库中查询出来的数据直接显示到 ListView 中。

    3、原型:

    new SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to , int flags) ;

    参数:

    1)、Context context, 这个与 SimpleListItemFactory 相关的 ListView 所处运行上下文(context)。也就是这个 ListView 所在的 Activity。

    2)、int layout, 显示 list item 的 布局文件。这个 layout 文件中至少要包含在 "to" 参数中命名的 views。

    3)、Cursor c, 数据库的光标( Cursor )。如果 cursor 无效,则该参数可以为 null

    4)、String[] from, 指定 column 中的哪些列的数据将绑定(显示)到 UI 中。如果 cursor 无效, 则该参数可为 null。

    5)、int[] to, 指定用于显示 "from" 参数指定的数据列表的 views。 这些 views 必须都是 TextViews。 "from" 参数的前 N 个值(valus)和 "to" 参数的前 N 个 views 是一一对应的关系。如果 cursor 无效,则该参数可为 null。

    6)、flags,用于定义适配器行为的标志位。

    Flags used to determine the behavior of the adapter; may be any combination of FLAG_AUTO_REQUERY and FLAG_REGISTER_CONTENT_OBSERVER。

    FLAG_AUTO_REQUERY(常量值:1 )从 API11 开始已经废弃。因为他会在应用程序的 UI 线程中执行游标查询操作, 导致响应缓慢甚至应用程序停止响应(ANR)的错误。作为替代方案,请使用 LoaderManager 和 CursorLoader.

    如果设置FLAG_REGISTER_CONTENT_OBSERVER(常量值:2),适配器会在游标上注册一个内容观测器,当通知到达时会调用 onContentChanged() 方法。

    示例代码:

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.item_listview_main,
    cursor, new String[] { "news_title","news_addtime" },
    new int[] { R.id.text_item_title, R.id.text_item_addtime });

    【备注:】

    SimpleCursorAdapter类构造方法的第四个参数表示返回Cursor对象中的字段名,第五个参数表示要将该字段的值赋给那个组件。该组件在第二个参数中指定的布局文件中定义。

    注意:在绑定数据时,Cursor对象返回的记录集中必须包含一个叫"_id"的字段,否则将无法完成数据绑定。也就是说SQL语句不能是selectname fromtb_contacts.如果在数据表中没有"_id"字段,可以采用其他方法来处理。

    那么数据库存到哪里?系统在手机内存中的/data/data//databases目录中创建数据库文件。