zoukankan      html  css  js  c++  java
  • Android中SQLiteOpenHelper的理解


    首先,我们百度百科,发现很有意思的一个地方:

    首先你会接触到一个让你惊讶的名词: Typelessness(无类型). 对! SQLite是无类型的. 这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中, 无论这列声明的数据类型是什么。对于SQLite来说对字段不指定类型是完全有效的. 如:Create Table ex1(a, b, c);
    接下来我们看看SQLiteOpenHelper是个什么东西:
    通过Android帮助文档可以看到,SQLiteOpenHelper是一个抽象类,继承自Object类,使用这个类需要用一个类来继承这个类,并重新一些方法。SQLiteOpenHelper的构造函数是:
    第一个参数是上下文,第二个参数是db的名字,第三个参数一般情况下都写NULL,第四个参数是版本号.
     在继承自SQLiteOpenHelper的类中有两个非常重要的方法需要重写:
    //该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabse对象的时候,才会调用这个方法
        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            System.out.println("create a Database");
            //execSQL函数用于执行SQL语句
            db.execSQL("create table user(id int,name varchar(20))");
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            System.out.println("update a Database");
        }

    代码是我直接拷的MARS老师的,oncreate是个回调函数,“实际上是在第一次得到SQLiteDatabse对象的时候,才会调用这个方法”,这句话的意思是即时个第一次实例化继承自SQLiOpenHelper类也不会创建表,只有在第一次getReadableDatabase()或者第一次getWriteableDatabase()的时候才会创建表。
    然后SQLite提供了一些基本的增删改查封装好的方法,也可以自己直接写sql语句(我不确定O(∩_∩)O~),例如查找方法:

    query(table, columns, selection, selectionArgs, groupBy, having, orderBy)   可以发现方法里的参数和sql语句非常相似,我们只要把相应的参数写入就可以了。

    public long insert (String table, String nullColumnHack, ContentValues values) 这是插入方法,返回的是 long类型插入的行数,在insert中用到了ContentValues类,键值对存储数据,目前我还不知道除了在这儿用一下这个类,这个类还有什么其他用处,三个参数中第二个参数一般写NULL。

    public int delete (String table, String whereClause, String[] whereArgs)   删除方法中第二个参数是条件,里面有占位符“?”,第三个参数是占位符的内容

    public int update (String table, ContentValues values, String whereClause, String[] whereArgs)   这是改的方法。

    然后涉及到读操作的话,实例化db的方法是:SQLiteDatabase db =this.getReadableDatabase()   涉及到写操作的话是   SQLiteDatabase db = this.getWritableDatabase()

    还有如果要创建的表固定的话,可以在继承自SQLiteOpenHelper的构造方法中直接创建,如果在程序中动态创建表的话,可以自己写个构造函数,创建想要的表。

     下面是csdn博主Android_Tutor的部分代码帮助大家理解下:

    package com.xue.sqlitedemo.sqlite;
    
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class BooksDB extends SQLiteOpenHelper {
    
        private final static String DATABASE_NAME = "BOOKS.db";
        private final static int DATABASE_VERSION = 1;
        private final static String TABLE_NAME = "books_table";
        public final static String BOOK_ID = "book_id";
        public final static String BOOK_NAME = "book_name";
        public final static String BOOK_AUTHOR = "book_author";
    
        public BooksDB(Context context, String name, CursorFactory factory,
                int version) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            // TODO Auto-generated constructor stub
        }
    
        public BooksDB(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            String sql = "CREATE TABLE " + TABLE_NAME + " (" + BOOK_ID
                    + " INTEGER primary key autoincrement, " + BOOK_NAME
                    + " text, " + BOOK_AUTHOR + " text);";
    
            db.execSQL(sql);
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
            // TODO Auto-generated method stub
            String sql = "DROP TABLE IF EXITS " + TABLE_NAME;
            db.execSQL(sql);
            onCreate(db);
        }
    
        public Cursor select() {
            SQLiteDatabase db = this.getReadableDatabase();
            Cursor cursor = db
                    .query(TABLE_NAME, null, null, null, null, null, null);
            return cursor;
        }
    
        public long insert(String bookname, String author) {
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues cv = new ContentValues();
            cv.put(BOOK_NAME, bookname);
            cv.put(BOOK_AUTHOR, author);
            long row = db.insert(TABLE_NAME, null, cv);
            return row;
        }
    
        public void delete(int id) {
            SQLiteDatabase db = this.getWritableDatabase();
            String where = BOOK_ID + " = ?";
            String[] whereValue = { Integer.toString(id) };
            db.delete(TABLE_NAME, where, whereValue);
        }
    
        public void update(int id, String bookname, String author) {
            SQLiteDatabase db = this.getWritableDatabase();
            String where = BOOK_ID + " = ?";
            String[] whereValue = { Integer.toString(id) };
            ContentValues cv = new ContentValues();
            cv.put(BOOK_NAME, bookname);
            cv.put(BOOK_AUTHOR, author);
            db.update(TABLE_NAME, cv, where, whereValue);
        }
    }

     好了,今天就到此为止,由于本人能力有些,写的有些杂乱,望海涵。

    每一个程序猿都是文艺青年!!!
  • 相关阅读:
    IDEA如何打包可运行jar的一个问题。
    从一个脚本谈loadrunner的脚本初始化
    explain 用法详解
    linux zip 命令详解
    Jmeter使用——参数化
    Jmeter Constant Throughput Timer 使用
    产生随机时间的例子
    Mysql的列索引和多列索引(联合索引)
    Loadrunner负载机agent
    Spring context:property-placeholder 一些坑
  • 原文地址:https://www.cnblogs.com/xue2b/p/3088934.html
Copyright © 2011-2022 走看看