android学习(四) 在 SQL 数据库中保存数据

定义架构和契约

public final class FeedReaderContract {
//为了防止有人不小心实例化类的构造函数而私有化构造函数,
    private FeedReaderContract(){};
    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";
    }
}

:通过实现 BaseColumns 接口,您的内部类可继承名为 _ID 的主键字段,某些 Android 类(比如光标适配器)将需要内部类拥有该字段。 这并非必需项,但可帮助您的数据库与 Android 框架协调工作。


使用SQL辅助工具创建数据库

private static final String TEXT_TYPE = " TEXT";//TEXT数据类型
private static final String COMMA_SEP = ",";
//创建表entry,主键是title,数据类型是text;另一个列是subtitle,数据类型是text
private static final String SQL_CREATE_ENTRIES =
    "CREATE TABLE " + FeedEntry.TABLE_NAME + " (" +
    FeedEntry._ID + " INTEGER PRIMARY KEY," +
    FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
    FeedEntry.COLUMN_NAME_SUBTITLE + TEXT_TYPE + " )";
//删除表entry
private static final String SQL_DELETE_ENTRIES =
    "DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME;

就像您在设备的内部存储中保存文件那样,Android 将您的数据库保存在私人磁盘空间,即关联的应用。 您的数据是安全的,因为在默认情况下,其他应用无法访问此区域。


SQLiteOpenHelper 类中有一组有用的 API。当您使用此类获取对您数据库的引用时,系统将只在需要之时而不是应用启动过程中执行可能长期运行的操作:创建和更新数据库。 您仅需调用 getWritableDatabase() getReadableDatabase() 即可。

注:由于它们可能长期运行,因此请确保您在后台线程中调用 getWritableDatabase() 或 getReadableDatabase(),比如使用 AsyncTask 或 IntentService。

要使用 SQLiteOpenHelper,请创建一个替换* onCreate()、onUpgrade() 和onOpen() *回调方法的子类。您可能还希望实现 onDowngrade(),但这并非必需操作。
例:

public class FeedReaderDbHelper extends SQLiteOpenHelper {
    //如果更改数据库架构,则必须增加数据库版本。
    public static final int DATABASE_VERSIOM = 1;
    public static final String DATABASE_NAME = "FeedReader.db";//数据库名字
    public FeedReaderDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSIOM);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE_ENTRIES);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //这个数据库只是在线数据的缓存,所以它的升级策略是简单地丢弃数据并重新开始
        db.execSQL(SQL_DELETE_ENTRIES);
        onCreate(db);
    }

    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        super.onDowngrade(db, oldVersion, newVersion);
    }
}

如果要访问数据库,实例化 SQLiteOpenHelper的子类

FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper(getContext());

将信息输入到数据库中

通过将一个 ContentValues 对象传递至 insert() 方法将数据插入数据库:

//在写模式下获取数据存储库
SQLiteDatabase db = mDbHelper.getWritableDatabase();
//创建一个新的值映射,其中列名是键
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_TITLE,"标题");
values.put(FeedEntry.COLUMN_NAME_SUBTITLE,"小标题");
//插入新行,返回新行的主键值
long newRowId = db.insert(FeedEntry.TABLE_NAME,null,values);

insert() 的第一个参数即为表格名称。

第二个参数将指示框架在 ContentValues 为空(即,您没有 put 任何值)时执行哪些操作。如果指定列名称,则框架将插入一行并将该列的值设置为 null。如果指定 null(就像此代码示例中一样),则框架不会在没有值时插入行。


从数据库读取信息

要从数据库中读取信息,请使用 query() 方法,将其传递至选择条件和所需列。该方法结合 insert() 和 update() 的元素,除非列列表定义了您希望获取的数据,而不是希望插入的数据。 查询的结果将在* Cursor* 对象中返回给您。

SQLiteDatabase db = mDbHelper.getWritableDatabase();
        //从那些列查询
        String[] projection = {
                FeedEntry._ID,
                FeedEntry.COLUMN_NAME_TITLE,
                FeedEntry.COLUMN_NAME_SUBTITLE
        };

        //筛选结果从列title中查询"My title"
        String selection = FeedEntry.COLUMN_NAME_TITLE + " = ?";
        String[] selectionArgs = { "My Title" };

        // 您希望如何在结果游标中排序结果
        String sortOrder =
                FeedEntry.COLUMN_NAME_SUBTITLE + " DESC";

        Cursor c = db.query(
                FeedEntry.TABLE_NAME,                     // 表
                projection,                               // 指定的列
                selection,                                // 筛选结果从列title中查询"?"
                selectionArgs,                            // "?"的值
                null,                                     // 不分组行
                null,                                     // 不按行组筛选
                sortOrder                                 // 结果排序方式
        );

要查看游标中的某一行,请使用* Cursor* 移动方法之一,您必须在开始读取值之前始终调用这些方法。 一般情况下,您应通过调用* moveToFirst()* 开始,其将“读取位置”置于结果中的第一个条目中。 对于每一行,您可以通过调用 Cursor 获取方法之一读取列的值,比如 getString() 或 getLong()。对于每种获取方法,您必须传递所需列的索引位置,您可以通过调用* getColumnIndex() 或 getColumnIndexOrThrow()* 获取。例如:

cursor.moveToFirst();
long itemId = cursor.getLong(
    cursor.getColumnIndexOrThrow(FeedEntry._ID)
);

从数据库删除信息

要从表格中删除行,您需要提供识别行的选择条件。 数据库 API 提供了一种机制,用于创建防止 SQL 注入的选择条件。 该机制将选择规范划分为选择子句和选择参数。 该子句定义要查看的列,还允许您合并列测试。 参数是根据捆绑到子句的项进行测试的值。由于结果并未按照与常规 SQL 语句相同的方式进行处理,它不受 SQL 注入的影响。

String selection = FeedEntry.COLUMN_NAME_TITLE+"LIKE ?";
String[] selectionArgs = {"My Title"};
db.delete(FeedEntry.TABLE_NAME,selection,selectionArgs);

更新数据库

当您需要修改数据库值的子集时,请使用 update() 方法。

更新表可将* insert()* 的内容值语法与 delete() 的 where 语法相结合。

SQLiteDatabase db = mDbHelper.getReadableDatabase();

// 一列新值
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_TITLE, "标题一");

//哪行更新,根据标题
String selection = FeedEntry.COLUMN_NAME_TITLE + " LIKE ?";
String[] selectionArgs = { "MyTitle" };

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

摘自android developer

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值