SQLite是一个开源的嵌入式关系数据库,他的一大好处是在程序内部不需要网络配置,也不需要管理,他只依赖于文件系统,开销小,适用于嵌入式设备。

   一:扩展SQLiteOpenHelper类提供数据访问接口

   SQLiteOpenHelper对数据库实现了很好的封装,如果在打开之前就创建或者更新数据库,则可以用这个类来实现。

   1:创建一个MySQLite类,继承自SQLiteOpenHelper类。

   2:构造函数:

   参数简介:

   第一个:当前Activity对象,即context;第二个:数据库名,为以后再data/data/包名/database/下面寻找的文件名,一般形如:****.db;

   第三个:为了创建游标对象,一般为null;第四个:版本号,为了以后表结构的更新准备,每更新一次表结构版本号就至少要增1,从而区分不同版本下的数据库。

   3:重写onCreate方法,这个方法主要完成数据库中表的创建。

   简介表的创建语句:create table 表名(_id 类型 约束(如:primary key autoincrement主键自增),列名1 类型 约束(如:not null不为空),列名2 类型 约束);

  特别注意:表中的主键必须为“_id”.

@Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table user(_id integer primary key autoincrement,name text not null)");
    }

   4:重写onUpgrade方法,这个方法用于数据库更新表结构时的操作。一般为:

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS 表名");// 如果数据库存在了这个表,那么删除这个表,重新创建
        db.execSQL("新的创建表的语句");
    }

   二:数据库的增删改查基本操作

   1:操作对象

   数据库的增删改查四中操作中,需要用到两种对象,分别为:

private SQLiteDatabase dbWriter;//获得数据库可写操作的对象
private SQLiteDatabase dbReader;//获得数据库可写操作的对象

   2:增加操作

   (1)获得ContentValues对象

ContentValues cv = new ContentValues();

   (2)调用ContentValues对象的put("键(数据库列名)","值")的方法完成数据的暂存

cv.put("列名",值);

   (3)调用dbWriter对象的insert方法,完成数据到数据库的操作。参数为(“表名”,约束,ContentValues对象)。

dbWriter.insert("表名", 约束, ContentValues对象);

   3:查询操作

   (1)创建Cursor对象,接收dbReader的query方法查询出来的数据表中的一个元组(就是一行信息)。参数为(表名,6个null(表示约束为默认))

Cursor cursor = dbReader.query("user", null, null, null, null, null, null);

   (2)创建String类型的对象,接收根据某一个列名所取得的值。

String str = cursor.getString(cursor.getColumnIndex("列名"));

   (3)根据Cursor对象的moveToNext()方法的判断,来进行数据的输出等操作。

   4:删除操作

   调用dbWriter的delete方法,完成删除操作。参数为(“表名”,约束,默认值null)。

dbWirter.delete(表名, 约束, 默认值null);

   5:修改操作    

  (1)获得ContentValues对象

ContentValues cv = new ContentValues();

  (2)调用ContentValues对象的put("键(数据库列名)","修改后的值")的方法完成数据的修改

cv.put("列名", "修改后的值");

  (3)调用dbWriter对象的update方法,完成数据修改与数据库的同步。参数为("表名", ContentValues对象, 约束, 默认值null);

dbWriter.update("表名", ContentValues对象,约束, 默认值null);

   三:数据库与ListView的联合使用

   1:SimpleCursorAdapter的使用

   数据库中的数据与ListView的组合使用用到了这个对象,且只能用这个对象

   (1)声明SimpleCursorAdapter对象

private SimpleCursorAdapter adapter;

   (2)构造方法实例化SimpleCursorAdapter对象。

   参数(当前Activity对象,列表中列表项的显示样式文件,数据源Cursor(这里为null,因为暂时没有),new String[]{"数据库中的列名(有几个写几个)"},new int[]{"列表中列表项的显示样式文件中控件的ID"})。

adapter = new SimpleCursorAdapter(this,列表项样式文件, 数据源null,
                new String[] {数据库表的列名 }, new int[] {
                        样式表中控件ID});

   (3)在 查询数据库的方法中通过SimpleCursorAdapter对象的changeCursor(Cursor对象)方法,实现重新适配。

adapter.changeCursor(cursor对象);

   (4)通过setListAdapter(SimpleCursorAdapter对象)的方法绑定adapter。

setListAdapter(adapter);// 绑定adapter

   2:特别注意:在主Activity对应的xml文件中的listView的id必须固定为:android:id="@android:id/list"。

   四:综合应用

   功能:通过数据库与SimpleCursorAdapte的联合使用,使得ListView中的数据从数据库中而来。

   ◆扩展SQLiteOpenHelper类提供数据访问接口

public class MySqklite extends SQLiteOpenHelper {
    //构造函数,注意参数的填写
    public MySqklite(Context context) {
        super(context, "quan.db", null, 4);
    }
    //重写onCreate方法,完成数据库表的创建
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table user(_id integer primary key autoincrement,name text not null)");
    }
    //重写onUpgrade方法
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists user");//数据库中如果存在这个表就删除这个表
        //重新创建一个表的结构
        db.execSQL("create table user(_id integer primary key autoincrement,name text not null,sex text not null)");
    }

   ◆主Activity

public class MainActivity extends ListActivity {
    private SQLiteDatabase dbWriter;// 获得数据库可写操作的对象
    private SQLiteDatabase dbReader;// 获得数据库可写操作的对象
    private MySqklite mySqlite;// 声明继承自SQLiteOpenHelper类的MySqklite对象
    private SimpleCursorAdapter adapter;// 声明SimpleCursorAdapter对象
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mySqlite = new MySqklite(this);// 实例化MySqklite对象
        dbWriter = mySqlite.getWritableDatabase();// 获得数据库可写操作权限
        dbReader = mySqlite.getReadableDatabase();// 获得数据库可读操作权限
        // 添加数据
         addDB();
        // 实例化SimpleCursorAdapter对象,注意参数的填写
        adapter = new SimpleCursorAdapter(this, R.layout.cell, null,
                new String[] { "name", "sex" }, new int[] { R.id.name_tv,
                        R.id.age_tv });
        setListAdapter(adapter);
        // updateDB();//修改数据
        // deleteDB();//删除数据
        selectDB();// 查询数据
    }
    // 添加数据
    public void addDB() {
        // 获得ContentValues对象
        ContentValues cv = new ContentValues();
        for (int i = 0; i < 5; i++) {
            if (i % 2 == 0) {
                cv.put("sex", "男");
            } else {
                cv.put("sex", "女");
            }
            // ContentValues对象的方法
            cv.put("name", "我的名字是" + i);
            // dbWriter的dbWriter方法实现数据的同步
            dbWriter.insert("user", null, cv);
        }
    }
    // 查询数据
    public void selectDB() {
        // 游标存储数据
        Cursor cursor = dbReader.query("user", null, null, null, null, null,
                null);
        // while (cursor.moveToNext()) {// 判断游标的移动
        // String str = cursor.getString(cursor.getColumnIndex("name"));//
        // 得到游标中列名name对应值
        // System.out.println(str);//输出值
        // }
        // 重新适配
        adapter.changeCursor(cursor);
    }
    // 删除数据
    public void deleteDB() {
        dbWriter.delete("user", "_id=1", null);
    }
    // 修改数据
    public void updateDB() {
        ContentValues cv = new ContentValues();
        cv.put("name", "Hello");// 修改后的数据的存储
        dbWriter.update("user", cv, "_id=2", null);
    }
}
    ◆结果

   (1)程序第一次运行时,要释放主Activity中的addDB和selectDB方法。在data/data/包名?database下的文件中,结果如图:Android数据存储----SQLite数据库_第1张图片

   (2)再次释放updateDB方法和selectDB方法,看数据库中的结果如图:

Android数据存储----SQLite数据库_第2张图片

   (3)再次释放deleteDB和selectDB方法,结果如图所示:Android数据存储----SQLite数据库_第3张图片

   

   还有一种SQLite的访问方式,我们再议。。。