Android : SQLite的使用

本文内容


!如下讲述,以RSS 订阅表为例,表名entry,含标题,子标题两列

1.定义模式和契约

定义一个Contract ,

在其内部实现一个静态内部类,内部类实现BaseColumns接口,

内部类中 定义表的模式。!注意: 系统创建表时会自动添加一个_id列。

public final class FeedReaderContract {
		    // To prevent someone from accidentally instantiating the contract class,
		    // make the constructor private.
		    private FeedReaderContract() {}
		    
		    /* Inner class that defines the table contents */
		    public static class FeedEntry implements BaseColumns {
		        public static final String TABLE_NAME = "entry";
		        public static final String COLUMN_NAME_TITLE = "title";
		        public static final String COLUMN_NAME_SUBTITLE = "subtitle";
		    }
}

2.使用 SQL Helper 创建数据库

先写好entry表 创建和删除的SQL语句


private static final String SQL_CREATE_ENTRIES =
    "CREATE TABLE " + FeedEntry.TABLE_NAME + " (" +
    FeedEntry._ID + " INTEGER PRIMARY KEY," +
    FeedEntry.COLUMN_NAME_TITLE + " TEXT," +
    FeedEntry.COLUMN_NAME_SUBTITLE + " TEXT)";

private static final String SQL_DELETE_ENTRIES =
    "DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME;

创建一个FeedReaderDbHelper 类, 继承自SQLiteOpenHelper

其中 当entry表的模式修改了, DATABASE_VERSION则要进行修改,否则再调试时,还是原来的旧表。除非app删除再安装。

public class FeedReaderDbHelper extends SQLiteOpenHelper {
    // If you change the database schema, you must increment the database version.
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "FeedReader.db";

    public FeedReaderDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE_ENTRIES);
    }
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // This database is only a cache for online data, so its upgrade policy is
        // to simply to discard the data and start over
        db.execSQL(SQL_DELETE_ENTRIES);
        onCreate(db);
    }
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onUpgrade(db, oldVersion, newVersion);
    }
}

3.插入数据

使用SQLite Helper 的getWritableDatabase()获取一个可写数据库对象db

插入数据需要用到一个ContentValues类, 使用其put方法以键值的方式存入数据

再调用db的insert方法 ,其中第二个参数为null表示当values值为空,则不执行插入

FeedReaderDbHelper dbHelper = new FeedReaderDbHelper(getContext());

// Gets the data repository in write mode
SQLiteDatabase db = dbHelper.getWritableDatabase();

// Create a new map of values, where column names are the keys
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_TITLE, title);
values.put(FeedEntry.COLUMN_NAME_SUBTITLE, subtitle);

// Insert the new row, returning the primary key value of the new row
long newRowId = db.insert(FeedEntry.TABLE_NAME, null, values);

4.读取数据

使用SQLite Helper 的getReadableDatabase()获取一个读数据库对象db

然后 一个SQL 语句被拆成以下四个部分

定义一个projection ,为要查询的列名串

定义一个selection,为要查询的where 条件

定义一个selectionArgs, 其值与selection 中的 ? 一 一对应

定义一个sortOrder,其为排序方式

最后创建一个游标对象查询

SQLiteDatabase db = dbHelper.getReadableDatabase();

// Define a projection that specifies which columns from the database
// you will actually use after this query.
String[] projection = {
    BaseColumns._ID,
    FeedEntry.COLUMN_NAME_TITLE,
    FeedEntry.COLUMN_NAME_SUBTITLE
    };

// Filter results WHERE "title" = 'My Title'
String selection = FeedEntry.COLUMN_NAME_TITLE + " = ?";
String[] selectionArgs = { "My Title" };

// How you want the results sorted in the resulting Cursor
String sortOrder =
    FeedEntry.COLUMN_NAME_SUBTITLE + " DESC";

Cursor cursor = db.query(
    FeedEntry.TABLE_NAME,   // The table to query
    projection,             // The array of columns to return (pass null to get all)
    selection,              // The columns for the WHERE clause
    selectionArgs,          // The values for the WHERE clause
    null,                   // don't group the rows
    null,                   // don't filter by row groups
    sortOrder               // The sort order
    );

使用游标的getLong或getString方法查询,

但是要传入所要查询的列名的索引作为参数,调用getColumnIndex或getColumnIndexOrThrow 获取

List itemIds = new ArrayList<>();
while(cursor.moveToNext()) {
  long itemId = cursor.getLong(
      cursor.getColumnIndexOrThrow(FeedEntry._ID));
  itemIds.add(itemId);
}
cursor.close();

5.删除数据

定义selection 和 selectionArgs

再调用delete方法

// Define 'where' part of query.
String selection = FeedEntry.COLUMN_NAME_TITLE + " LIKE ?";
// Specify arguments in placeholder order.
String[] selectionArgs = { "MyTitle" };
// Issue SQL statement.
int deletedRows = db.delete(FeedEntry.TABLE_NAME, selection, selectionArgs);

6.更新数据

使用ContentValues类,以键值方式存储,其中键为要更新的列名,值为更新后的新值

selection 为where条件,selectionArgs中的值与selection中的?一 一 对应,系统执行时替换其中的问号

最后调用SQLiteDatabase 的update方法

SQLiteDatabase db = dbHelper.getWritableDatabase();

// New value for one column
String title = "MyNewTitle";
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_TITLE, title);

// Which row to update, based on the title
String selection = FeedEntry.COLUMN_NAME_TITLE + " LIKE ?";
String[] selectionArgs = { "MyOldTitle" };

int count = db.update(
    FeedReaderDbHelper.FeedEntry.TABLE_NAME,
    values,
    selection,
    selectionArgs);

7.保持连接与断开

数据库的开启极其占用内存,如在调用getWritableDatabase和getReadDatabase时

所以仅在activity 的 onDestroy时关闭

@Override
protected void onDestroy() {
    dbHelper.close();
    super.onDestroy();
}

本文参考安卓官方文档 Save data using SQLite

本文作者:林东豪 原文链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值