Android : SQLite的使用

    xiaoxiao2025-04-21  11

    本文内容

    文章目录

    1.定义模式和契约2.使用 SQL Helper 创建数据库3.插入数据4.读取数据5.删除数据6.更新数据7.保持连接与断开 !如下讲述,以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

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

    最新回复(0)