android学习(四) 在 SQL 数据库中保存数据
2017-04-07 18:02
330 查看
定义架构和契约
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
相关文章推荐
- Android 在 SQL 数据库中保存数据
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- Android---把数据保存到数据库中(二)
- 跟Google学习Android开发-起始篇-保存数据(2)
- Android学习 —— 数据的存储与访问方式二: SharedPreferences(偏好参数保存)
- ^_^,学习javascript,上下移动行后用js把数据保存到xml文件中,然后在服务器端读这个xml保存到数据库中
- 跟Google学习Android开发-起始篇-保存数据(1)
- Android学习 之 Bitmap Drawable byte[] 三者之间的转换以及把数组存入数据库及提取数据重新组合成所需对象,如图像
- [Android Training视频系列] 6.3 Saving Data in SQL Databases(保存数据到SQLite)
- android 数据库 SQLiteOpenHelper和ContentProvider学习笔记---添加数据及显示(一)
- 个人学习代码保存:例2.小项目的sql简单的数据库操作类
- 两次SQL 学习之感悟——数据库查询语言——走进数据系列之十二
- Android学习 之 Bitmap Drawable byte[] 三者之间的转换以及把数组存入数据库及提取数据重新组合成所需对象,如图像
- Android---把数据保存到数据库中(一)
- android 数据库 SQLiteOpenHelper和ContentProvider学习笔记---添加修改删除数据之联系人(二)
- 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- 学习操作oracle.sql.Blob数据类型,向数据库插入Blob数据类型的数据
- Android学习 —— 数据的存储与访问方式二: SharedPreferences(偏好参数保存)
- android保存数据(意外被清理的情况下)和android的生命周期(onRestoreInstanceState和onSaveInstanceState)学习