在SQL数据库保存数据

本文介绍了如何在Android应用中使用SQLite数据库保存结构化数据。首先,定义数据库模式和合同类,接着创建数据库和表,包括使用SQLiteOpenHelper类进行数据库操作。内容还涵盖了插入、查询、更新和删除数据的基本方法。

保存数据到数据库是理想的重复或结构化数据,如联系信息。这类假定您熟悉SQL数据库,帮助您开始使用SQLite数据库在Android上。api需要使用数据库android.database在Android上可用。sqlite包。

定义一个模式和合同

SQL数据库的主要原则之一的模式:一个正式的数据库是如何组织的宣言。模式反映在您所使用的SQL语句来创建数据库。你会发现它有助于创建一个同伴类,称为合同类,它显式地指定的布局模式系统和自我记录。

合同类的容器为uri常量定义名称,表和列。合同类允许您使用相同的常数在所有其他的类放在同一个包内。这允许您改变一个列名在一个地方,并让它在代码中传播。

组织合同类的一个好方法是把整个数据库的定义,是全球性的根类的水平。然后cr eate为每个表一个内部类,列举了其列。

注意:通过实现BaseColumns界面,内部类可以继承一个主键字段叫做_ID一些Android类,如光标适配器将期望它。这不是必需的,但是这可以帮助您的数据库工作和谐与Android框架。

例如,这个代码片段定义了一个表的表名和列名:

public final class FeedReaderContract {
    // To prevent someone from accidentally instantiating the contract class,
    // give it an empty constructor.
    public FeedReaderContract() {}

    /* Inner class that defines the table contents */
    public static abstract class FeedEntry implements BaseColumns {
        public static final String TABLE_NAME = "entry";
        public static final String COLUMN_NAME_ENTRY_ID = "entryid";
        public static final String COLUMN_NAME_TITLE = "title";
        public static final String COLUMN_NAME_SUBTITLE = "subtitle";
        ...
    }
}

使用SQL助手创建一个数据库

一旦你定义了数据库的样子,你应该实现创建和维护数据库和表的方法。下面是一些典型的语句,创建和删除一个表:

private static final String TEXT_TYPE = " TEXT";
private static final String COMMA_SEP = ",";
private static final String SQL_CREATE_ENTRIES =
    "CREATE TABLE " + FeedEntry.TABLE_NAME + " (" +
    FeedEntry._ID + " INTEGER PRIMARY KEY," +
    FeedEntry.COLUMN_NAME_ENTRY_ID + TEXT_TYPE + COMMA_SEP +
    FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
    ... // Any other options for the CREATE command
    " )";

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

就像文件保存在设备的内部存储,Android将数据库存储在私有磁盘空间关联的应用程序。你的数据是安全的,因为默认情况下这个地区无法访问其他应用程序。

一套有用的api SQLiteOpenHelper类中是可用的。当你使用这个类来获取数据库的引用,系统执行的可能长时间运行的操作只在需要时创建和更新数据库,而不是在应用程序启动期间。所有你需要做的是叫getWritableDatabase()或getReadableDatabase()。

注意:因为他们可以长时间运行,确保你叫getWritableDatabase()或getReadableDatabase()在一个后台线程,比如AsyncTask或IntentService。

使用SQLiteOpenHelper,创建一个子类覆盖onCreate(),onUpgrade()和onOpen()回调方法。您可能还想实现onDowngrade(),但这不是必需的。

举例来说,这里的SQLiteOpenHelper的一个实现,它使用一些上面所示的命令:

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);
    }
}
对数据库的访问,SQLiteOpenHelper的子类实例化:

FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper(getContext());
将信息放入数据库

将数据插入数据库通过ContentValuesobject Insert()方法:

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

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

// Insert the new row, returning the primary key value of the new row
long newRowId;
newRowId = db.insert(
         FeedEntry.TABLE_NAME,
         FeedEntry.COLUMN_NAME_NULLABLE,
         values);
插入insert()的第一个参数是简单的表名。第二个参数提供的名称列的框架可以插入NULL如果ContentValues是空的(如果你设置这个“空”,那么框架不会插入一行时没有值)。

从数据库读取信息

要从数据库中读取,可以使用query()方法,传递你的选择标准和所需的列。方法结合元素的插入insert()和更新update(),除了列列表定义你想获取的数据,而不是插入的数据。1,负责查询结果返回给你一个游标对象。

SQLiteDatabase db = mDbHelper.getReadableDatabase();

// Define a projection that specifies which columns from the database///定义一个投影,从数据库中指定的列
// you will actually use after this query.//你会使用这个查询。
String[] projection = {
    FeedEntry._ID,
    FeedEntry.COLUMN_NAME_TITLE,
    FeedEntry.COLUMN_NAME_UPDATED,
    ...
    };

// How you want the results sorted in the resulting Cursor//如何你想要的结果排序结果光标
String sortOrder =
    FeedEntry.COLUMN_NAME_UPDATED + " DESC";

Cursor c = db.query(
    FeedEntry.TABLE_NAME,  // The table to query//表查询
    projection,                               // The columns to return//返回的列
    selection,                                // The columns for the WHERE clause//WHERE子句的列
    selectionArgs,                            // The values for the WHERE clause//WHERE子句的值
    null,                                     // don't group the rows
    null,                                     // don't filter by row groups//不过滤行组织
    sortOrder                                 // The sort order//排序顺序
    );
看游标中的一行,使用光标移动方法之一,阅读前你必须调用值。一般来说,你应该开始通过调用moveToFirst(),它将“读”中的第一项的结果。对于每一行,可以通过调用读一个列的值的一个光标get方法,如getString()或getLong()。对于每个get方法,您必须通过索引列的位置你的欲望,你可以通过调用getColumnIndex()或getColumnIndexOrThrow()。例如

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

从数据库删除信息

从一个表中删除行,您需要提供确定的行选择标准。数据库API提供了一种机制来创建可防止SQL注入的选择标准。选择规范分为选择机制条款和选择参数。子句定义的列,并且允许您将列测试。参数的值绑定到的测试条款。因为结果不是一样的常规处理SQL语句,它是SQL注入免疫。

// Define 'where' part of query.
String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";
// Specify arguments in placeholder order.
String[] selectionArgs = { String.valueOf(rowId) };
// Issue SQL statement.
db.delete(table_name, selection, selectionArgs);

更新数据库

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

更新的表结合内容值语法插入insert()和delete()的语法。

SQLiteDatabase db = mDbHelper.getReadableDatabase();

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

// Which row to update, based on the ID
String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";
String[] selectionArgs = { String.valueOf(rowId) };

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值