在SQL数据库保存数据
保存数据到数据库是理想的重复或结构化数据,如联系信息。这类假定您熟悉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);
更多相关文章
- android studio导入其他项目工程报错解决方法
- Android(安卓)Dialog用法大全
- Android(安卓)ListView工作原理完全解析,带你从源码的角度彻底理
- [android app][eclipse技巧]如何快速复写(Override)方法
- Fragment和ViewPager的介绍和使用
- Unity3d和Android的互相调用(一)
- [转]Android(安卓)init 启动过程分析
- Android:自定义滚动边缘(EdgeEffect)效果
- Android事件拦截处理机制理解: