保存数据到数据库是理想的重复或结构化数据,如联系信息。这类假定您熟悉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 modeSQLiteDatabase db = mDbHelper.getWritableDatabase();// Create a new map of values, where column names are the keysContentValues 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 rowlong 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 columnContentValues values = new ContentValues();values.put(FeedEntry.COLUMN_NAME_TITLE, title);// Which row to update, based on the IDString selection = FeedEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";String[] selectionArgs = { String.valueOf(rowId) };int count = db.update(    FeedReaderDbHelper.FeedEntry.TABLE_NAME,    values,    selection,    selectionArgs);

更多相关文章

  1. android studio导入其他项目工程报错解决方法
  2. Android(安卓)Dialog用法大全
  3. Android(安卓)ListView工作原理完全解析,带你从源码的角度彻底理
  4. [android app][eclipse技巧]如何快速复写(Override)方法
  5. Fragment和ViewPager的介绍和使用
  6. Unity3d和Android的互相调用(一)
  7. [转]Android(安卓)init 启动过程分析
  8. Android:自定义滚动边缘(EdgeEffect)效果
  9. Android事件拦截处理机制理解:

随机推荐

  1. SQL对数据进行按月统计或对数据进行按星
  2. SQL server数据库创建代码 filegroup文件
  3. SQL Server基础之行数据转换为列数据
  4. Sql server端口未打开连接不上的解决方案
  5. sql server编写通用脚本实现获取一年前日
  6. SQL Server的IP不能连接问题解决
  7. SqlServer 数据库 三大范式
  8. SQL Server实现跨库跨服务器访问的方法
  9. sql server使用公用表表达式CTE通过递归
  10. sql中时间以5分钟半个小时任意间隔分组的