1.什么是SQLite数据库
-SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,很适合在移动设备上使用, 不仅支持标准SQL语法,还遵循ACID(数据库事务)原则,无需账号,使用起来非常方便!
1.1特色:轻量级、独立、隔离、跨平台、多语言接口、安全性
小结:Qlite通过文件来保存数据库,一个文件就是一个数据库,数据库中又包含多个表格,表格里又有多条记录,每个记录由多个字段构成,每个字段有对应的值,每个值我们可以指定类型,也可以不指定 类型(主键除外)
1.2如何和数据库打交道
1.2.1 如何设计数据库与表
使用SQL Helper创建DB
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,intoldVersion,intnewVersion){
// 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,intoldVersion,intnewVersion)
{
onUpgrade(db, oldVersion, newVersion);
}
}
1.2.2 对数据库进行增删查改
添加信息到DB
通过传递一个 ContentValues 对象到insert()方法:
// 获取数据存储库以写模式
SQLiteDatabase db = mDbHelper.getWritableDatabase();
// 创建一个新的映射的值,key-value形式
ContentValues values = new ContentValues();
values.put(FeedReaderContract.FeedEntry.COLUMN_NAME_ENTRY_ID, id);
values.put(FeedReaderContract.FeedEntry.COLUMN_NAME_TITLE, title);
values.put(FeedReaderContract.FeedEntry.COLUMN_NAME_CONTENT, content);
// 插入新行,返回主键值的新行,插入若失败返回的值为-1
long newRowId;
newRowId = db.insert(FeedReaderContract.FeedEntry.TABLE_NAME, FeedReaderContract.FeedEntry.COLUMN_NAME_NULLABLE,values);
解释:insert()方法的第一个参数是table名,第二个参数会使得系统自动对那些ContentValues没有提供数据的列填充数据为null,如果第二个参数传递的是null,那么系统则不会对那些没有提供数据的列进行填充。
从DB中读取信息
为了从DB中读取数据,需要使用query()方法,传递需要查询的条件。查询后会返回一个 Cursor 对象。
SQLiteDatabase db = mDbHelper.getReadableDatabase();
// 定义一个从数据库中指定的列projection
// 将在query方法里使用
String[] projection = { FeedReaderContract.FeedEntry._ID, FeedReaderContract.FeedEntry.COLUMN_NAME_TITLE, FeedReaderContract.FeedEntry.COLUMN_NAME_UPDATED, ... };
//如何你想要的结果排序结果光标
String sortOrder = FeedReaderContract.FeedEntry.COLUMN_NAME_UPDATED + " DESC";
Cursor c = db.query(FeedReaderContract.FeedEntry.TABLE_NAME, // table_name
projection, // The columns to return
selection, // WHERE子句的列--制定哪列即哪个key
selectionArgs, // 值的字符串数组
null, // don't group the rows
null, // don't filter by row groups
sortOrder // The sort order );
要查询在cursor中的行,使用cursor的其中一个move方法,但必须在读取值之前调用。一般来说应该先调用moveToFirst()函数,将读取位置置于结果集最开始的位置。对每一行,我们可以使用cursor的其中一个get方法如getString()或getLong()获取列的值。对于每一个get方法必须传递想要获取的列的索引位置(index position),索引位置可以通过调用getColumnIndex()或getColumnIndexOrThrow()获得。
下面演示如何从course对象中读取数据信息:
cursor.moveToFirst();longitemId = cursor.getLong( cursor.getColumnIndexOrThrow(FeedReaderContract.FeedEntry._ID));
删除DB中的信息
和查询信息一样,删除数据同样需要提供一些删除标准。DB的API提供了一个防止SQL注入的机制来创建查询与删除标准。
SQL Injection:(随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码时没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入)
该机制把查询语句划分为选项条件与选项参数两部分。条件定义了查询的列的特征,参数用于测试是否符合前面的条款。由于处理的结果不同于通常的SQL语句,这样可以避免SQL注入问题。
// Define 'where' part of query.
String selection = FeedReaderContract.FeedEntry.COLUMN_NAME_ENTRY_ID +" LIKE ?";
// Specify arguments in placeholder order.
String[] selelectionArgs = { String.valueOf(rowId) };
// Issue SQL statement.
db.delete(table_name, mySelection, selectionArgs);
更新数据
当需要修改DB中的某些数据时,使用 update() 方法。
update结合了插入与删除的语法。
SQLiteDatabase db = mDbHelper.getReadableDatabase();
// New value for one column
ContentValues values=newContentValues();values.put(FeedReaderContract.FeedEntry.COLUMN_NAME_TITLE, title);
// Which row to update, based on the ID
String selection = FeedReaderContract.FeedEntry.COLUMN_NAME_ENTRY_ID +" LIKE ?";
String[] selectionArgs = { String.valueOf(rowId) };
int count = db.update( FeedReaderDbHelper.FeedEntry.TABLE_NAME,values,selection,selectionArgs);
1.3优化
1.3.1如何设计数据库与表
上万条数据如何建表,比如300个城市,每个城市600条信息
1.3.2对数据库进行增删查改
原始SQL语句执行效率更高 rawQuery execSQL
只检索有用的列、有用的行,越少越好
是否排序
是否创建索引
1.3.3事务
1.3.4对象关系映射ORM
2.Content Provider
2.1什么是Content Provider
2.2Google是怎么定义Content Provider的?
内容提供者将一些特定的应用程序数据供给其他应用程序使用
数据可以存储于文件系统、SQLite数据库或其他方式。
内容提供者继承于ContentProvider基类,为其他应用程序取用和存储它管理的数据实现了一套标准方法。
应用程序不直接调用这些方法,而是使用ContentResolver对象,调用它的方法作为替代。
ContentResolver可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理
2.3ContentResolver类(通过它对Content Provider里的数据进行CRUD)
ContentResolver
onCreate();
insert()
delete()
query()
update()
getType()