Android 的 Sqlite基本操作

在 SQL 数据库中保存数据

采用数据库
将数据保存到数据库对于再度或结构化数据(比如契约音讯)而言是一石二鸟之选。
本课程假定你基本熟习 SQL 数据库并且可扶助您初阶在 Android 中运用 SQLite
数据库。 您在 Android 中行使数据库所需的 API 在 android.database.sqlite
软件包中提供。

概念架构和契约

SQL 数据库的根本标准之一是架设:数据库怎么样社团的正规化申明。
架构展示于你用于创建数据库的 SQL
语句。您会意识它有助于创建伴随类,即契约类,其以一种系统性、自记录的主意一目通晓指定您的架构布局。

契约类

是用来定义 U帕杰罗I、表格和列名称的常数的容器。
契约类允许你跨同一软件包中的所有其余类应用同一的常数。
您可以在一个职责更改列名称并使其在你整个代码中传出。
团伙契约类的一种可以方法是将对此你的整体数据库而言是全局性的定义放入类的根级别。
然后为枚举其列的逐个表格创造内部类。
注:通过达成 BaseColumns 接口,您的内部类可继承名为 _ID
的主键字段,某些 Android 类(比如光标适配器)将急需中间类具有该字段。
那毫不必需项,但可扶助你的数据库与 Android 框架协调工作。
诸如,该代码段定义了单个表格的表格名称和列名称:
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”; }}

使用 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_TITLE + TEXT_TYPE +
COMMA_SEP + FeedEntry.COLUMN_NAME_SUBTITLE + TEXT_TYPE + ”
)”;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(),但那并非必需操作。
诸如,上边是一个行使如上所示一些限令的 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());

将音讯输入到数据库

因此将一个 ContentValues 对象传递至 insert() 方法将数据插入数据库:
// Gets the data repository in write modeSQLiteDatabase db =
mDbHelper.getWritableDatabase();// Create a new map of values, where
column names are the keysContentValues 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 rowlong newRowId
= db.insert(FeedEntry.TABLE_NAME, null, values);

insert() 的首先个参数即为表格名称。
第一个参数将指令框架在 ContentValues 为空(即,您没有 put
任何值)时实施怎么着操作。如果指定列名称,则框架将插入一行并将该列的值设置为
null。如若指定
null(就好像此代码示例中平等),则框架不会在没有值时插入行。

从数据库读取音讯

要从数据库中读取信息,请使用 query()
方法,将其传递至选用原则和所需列。该格局结合 insert() 和 update()
的因素,除非列列表定义了您愿意得到的多少,而不是可望插入的多少。
查询的结果将在 Cursor 对象中回到给你。
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_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
CursorString sortOrder = FeedEntry.COLUMN_NAME_SUBTITLE + ”
DESC”;Cursor c = db.query( FeedEntry.TABLE_NAME, // The table to query
projection, // The columns to return 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 );

要翻看游标中的某一行,请使用 Cursor
移动方法之一,您必须在起头读取值以前一直调用那个点子。
一般景色下,您应透过调用 moveToFirst()
初始,其将“读取地方”置于结果中的第三个条款中。
对于每一行,您可以通过调用 Cursor 获取方式之一读取列的值,比如
getString() 或
getLong()。对于各个获取格局,您必须传递所需列的目录地方,您可以由此调用
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_TITLE + ” LIKE ?”;// Specify arguments in
placeholder order.String[] selectionArgs = { “MyTitle” };// Issue SQL
statement.db.delete(FeedEntry.TABLE_NAME, selection, selectionArgs);

立异数据库

当您必要修改数据库值的子集时,请使用 update() 方法。
更新表可将 insert() 的情节值语法与 delete() 的 where 语法相结合。
SQLiteDatabase db = mDbHelper.getReadableDatabase();// New value for one
columnContentValues values = new
ContentValues();values.put(FeedEntry.COLUMN_NAME_TITLE, title);//
Which row to update, based on the titleString selection =
FeedEntry.COLUMN_NAME_TITLE + ” LIKE ?”;String[] selectionArgs = {
“MyTitle” };int count = db.update(
FeedReaderDbHelper.FeedEntry.TABLE_NAME, values, selection,
selectionArgs);

自家的微信二维码如下,欢迎沟通商量

此地写图片描述

迎接关心《IT面试题汇总》微信订阅号。每一日推送经典面试题和面试心得技巧
微信订阅号二维码如下:

此处写图片描述

网站地图xml地图