1. Android数据库简介
SQLite数据库可以通过一种结构化的、易于管理的方式来存储应用程序数据。Android提供了一个完整的SQLite关系数据库的库文件。每个应用程序都可以创建自己的数据库,并对这个数据库拥有完全的控制权。
Android数据库存储在设备(或模拟器)上的/data/data/<package_name>/databases文件夹中。所有的数据库都是私有的,只能被创建它的应用程序访问。
2. SQLiteOpenHelper类:
是一个抽象类,用来创建、打开和升级数据库的最佳实践类。
通过实现SQLiteOpenHelper,可以隐藏那些用于决定一个数据库在打开之前是否需要创建或者升级的逻辑。
SQLiteOpenHelper会在成功打开数据库实例后缓存它们,所以你可以在刚好要执行查询或事务前请求打开数据库。
SQLiteOpenHelper类通过重写其构造函数onCreate()、onUpgrade()方法分别处理创建新数据库和升级新版本数据库过程。
要使用SQLiteOpenHelper访问数据库,需要调用getWritableDatabase或getReadableDatabase来分别打开和获取底层数据库的一个可写或只读的实例。
在后台,如果数据库不存在,辅助类就会执行它的onCreate处理程序。如果数据库的版本发生了改变,则onUpgrade处理程序就会被触发。在这种情况下,get<Read/Writ>ableDatabase调用将会正确的返回已缓存的、新建的或升级过的数据库。
当数据库成功打开后,SQLiteOpenHelper将缓存它,以便你每次查询数据库或者执行数据库事务时能够使用这些方法,而不是在你的应用程序中缓存打开的数据库。
3. Cursor类:
数据库查询作为Cursor对象返回。Cursor是底层数据中的结果集的指针,它没有提取和返回结果集的副本。
Cursor导航函数:
moveToFirst:把游标移动到查询结果中的第一行
moveToNext:把游标移动都下一行
moveToPrevious:把游标移动到前一行
getCount:返回结果集中的行数
getColumnIndexOrThrow:返回具有制定名称的列的索引,索引从零开始计数
getColumnName:返回制定列索引的名称
getColumnNames:返回当前Cursor中的所有列名的字符串数组
getPosition:返回当前的游标位置
4. SQLiteDatabase类:
SQLiteDatabase通过提供insert、delete、update方法来封装执行这些操作(添加、删除、修改)所需要的SQL语句。如果希望手动执行这些操作,则使用execSQL(sql)方法可以对数据库表格执行任何有效的SQL语句。
5. ContentValue:
ContentValue用来向数据库的表中插入新一行。每一个ContentValue对象都将一个表行表示为列名到值得映射。
<><><> 实例 <><><>
<span style="font-size:14px;">pblic class MySqliteOpenHelper extends SQLiteOpenHelper
{
public MySqliteOpenHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
//当磁盘上不存在数据库,辅助类需要创建一个新数据库
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.w(KEY_TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS contacts");
onCreate(db);
}
}
</span>
<p><span style="font-size:14px;">public class MySQLiteDatabase
{
public static final String KEY_ID = "_id";
public static final String KEY_NAME = "_name";
public static final String KEY_EMAIL = "_email";
public static final String KEY_TAG = "_DBAdapter";
private static final String DATABASE_NAME = "MyDB.db";
private static final String DATABASE_TABLE = "contacts";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE = "create table "
+ DATABASE_TABLE + " (" + KEY_ID + " integer primary key autoincrement, "
+ KEY_NAME + " text not null, "
+ KEY_EMAIL + " float, "
+ KEY_TAG + " integer);";
private final Context context;
private MySqliteOpenHelper mySqliteOpenHelper;
private SQLiteDatabase db;
public MySQLiteDatabase(Context ctx)
{
this.context = ctx;
mySqliteOpenHelper = new MySqliteOpenHelper(context);
}
public MySQLiteDatabase open() throws SQLException
{
db = mySqliteOpenHelper.getWritableDatabase();
return this;
}
public void close()
{
mySqliteOpenHelper.close();
}
/* 插入 */
public long insert(Model model)
{
ContentValues insertValues = new ContentValues();
insertValues.put(KEY_NAME, model.getName());
insertValues.put(KEY_EMAIL, model.getEmail());
return db.insert(DATABASE_TABLE, null, insertValues);
}
/* 删除 */
public boolean delete(long rowId)
{
String whereClause = KEY_ID + "=" + rowId;
String whereArgs[] = null;
return db.delete(DATABASE_TABLE, whereClause, whereArgs) > 0;
}
/* 获取所有数据 */
public Cursor getAllContacts()
{
return db.query(DATABASE_TABLE, new String[] {KEY_ID, KEY_NAME, KEY_EMAIL}, null, null, null, null, null);
}
/* 获取一行数据 */
public Cursor getContact(long rowId)
{
String whereClause = KEY_ID + "=" + rowId;
Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {KEY_ID, KEY_NAME, KEY_EMAIL}, whereClause, null, null, null, null, null);
if(mCursor != null)
{
mCursor.moveToFirst();
}
return mCursor;
}
/* 修改 */
public boolean update(Model model)
{
ContentValues updateValues = new ContentValues();
updateValues.put(KEY_NAME, model.getName());
updateValues.put(KEY_EMAIL, model.getEmail());
String whereClause = KEY_ID + "=" + model.getID();
String whereArgs[] = null;
return db.update(DATABASE_TABLE, updateValues, whereClause, whereArgs) > 0;
}
}</span></p>
<span style="font-size:14px;">public class Model
{
private int ID;
private String NAME;
private String EMAIL;
public Model()
{
super();
}
public int getID()
{
return this.ID;
}
public void setID(int id)
{
this.ID = id;
}
public String getName()
{
return this.NAME;
}
public void setName(String name)
{
this.NAME = name;
}
public String getEmail()
{
return this.EMAIL;
}
public void setEmail(String accessible)
{
this.EMAIL = accessible;
}
}</span>