編輯:Android開發實例
1.Android中通過SQLite數據庫引擎來實現結構化數據存儲。SQLite是一個嵌入式數據庫引擎,針對內存等資源有限的設備,提供的是一種高效的數據庫引擎。
Android中操作數據庫首先要通過一個 類:android.database.sqlite.SQLiteOpenHelper。它封裝了如何打開一個數據庫,其中當然也包含如果數據庫不存在 就創建這樣的邏輯。看一個例子:
pubilc class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "com.roiding.simple.note";
private static final int DATABASE_VERSION = 1;
private static final String NOTES_TABLE_NAME = "notes";
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + NOTES_TABLE_NAME
+ " (id integer primary key autoincrement, name text);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS notes");
onCreate(db);
}
}
這裡面,如下的語句需要解釋:
在Android中,數據庫存放在 /data/data/PACKAGE_NAME/databases 目錄下。
接下來就可以使用這個Helper來操作數據庫了,操作數據庫也就無非是增、刪、改、查。先看一個增的例子:
public static void insert(Context context, String s) {
DatabaseHelper mOpenHelper = new DatabaseHelper(context);
String table = "notes";
String nullColumnHack = "id";
ContentValues values = new ContentValues();
values.put("name", "www.roiding.com");
long id = mOpenHelper.getReadableDatabase().insert(table,
nullColumnHack, values);
mOpenHelper.getReadableDatabase().close();
}
再看一個查的例子:
public static void select(Context context) {
DatabaseHelper mOpenHelper = new DatabaseHelper(context);
String table = "notes";
String[] columns = new String[] { "id", "name" };
String selection = "id>? and name<>?";
String[] selectionArgs = new String[] { "0", "roiding.com" };
String groupBy = null;
String having = null;
String orderBy = "id desc";
String limit = "1";
Cursor c = mOpenHelper.getReadableDatabase().query(table,
columns, selection, selectionArgs, groupBy, having, orderBy, limit);
c.moveToFirst();
for (int i = 0; i < c.getCount(); i++) {
String s = c.getString(1);
c.moveToNext();
}
c.close();
mOpenHelper.getReadableDatabase().close();
}
再看一個刪除和修改的例子:
public static void delete(Context context) {
DatabaseHelper mOpenHelper = new DatabaseHelper(context);
String table = "notes";
String selection = "id>? and name<>?";
String[] selectionArgs = new String[] { "0", "roiding.com" };
String whereClause = selection;
String[] whereArgs = selectionArgs;
mOpenHelper.getWritableDatabase().delete(table, whereClause, whereArgs);
mOpenHelper.getWritableDatabase().close();
}
有了上面的基礎這裡就容易理解了,這裡的whereClause相當於前面的selection,whereArgs相當於前面的selectionArgs。
public static void update(Context context) {
DatabaseHelper mOpenHelper = new DatabaseHelper(context);
String table = "notes";
String selection = "id>? and name<>?";
String[] selectionArgs = new String[] { "0", "roiding.com" };
String whereClause = selection;
String[] whereArgs = selectionArgs;
ContentValues values = new ContentValues();
values.put("name", "www.roiding.com");
mOpenHelper.getWritableDatabase().update(table, values,
whereClause, whereArgs);
mOpenHelper.getWritableDatabase().close();
}
這個update的用法,綜合select和delete就可以理解。
注意:
在真實的應用中,會對上面這些基本操作做更高一級的抽象和封裝,使之更容易使用。在select時,除了用上述的方法,將分段的SQL語句傳進去之外,Android還支持一種方法:使用SQLiteQueryBuilder。如果使用的是上述的分段SQL語句的方法,在Android的內部實現中,也是先將分段的SQL使用SQLiteQueryBuilder的靜態方法來生成一個真正的SQL的,而且,我沒有看出來使用SQLiteQueryBuilder的優勢。
/Chapter09_Data_03/src/com/amaker/test/MainActivity.java
package com.amaker.test;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SQLiteDatabase db = createDatabase();
//createTable(db);
//insert(db);
//insert2(db);
//update(db);
// update2(db);
// delete(db);
delete2(db);
query(db);
db.close();
}
// 創建數據庫,注意這裡要指定全路徑
private SQLiteDatabase createDatabase(){
return SQLiteDatabase.openOrCreateDatabase("/data/data/com.amaker.test/databases/temp2.db", null);
}
// 創建表
private void createTable(SQLiteDatabase db){
String sql = " create table UserTbl(_id integer primary key autoincrement,username text,password text)";
db.execSQL(sql);
}
// 插入數據
private void insert(SQLiteDatabase db){
String sql = " insert into UserTbl(username,password) values('amaker','123') ";
db.execSQL(sql);
}
// 插入2
private void insert2(SQLiteDatabase db){
ContentValues cv =new ContentValues();
cv.put("username","ghz");
cv.put("password", "456");
db.insert("UserTbl", null, cv);
}
// 查詢
private void query(SQLiteDatabase db){
Cursor c = db.query("UserTbl", null, null, null, null, null, null);
if(c.moveToFirst()){
for (int i = 0; i < c.getCount(); i++) {
c.move(i);
int id = c.getInt(0);
String username = c.getString(1);
String password = c.getString(2);
System.out.println(id+":"+username+":"+password);
}
}
}
// 修改
private void update(SQLiteDatabase db){
String sql = " update UserTbl set password=888 where _id=1 ";
db.execSQL(sql);
}
// 修改2
private void update2(SQLiteDatabase db){
ContentValues values = new ContentValues();
values.put("password", "999");
String whereClause = "_id=?";
String[] whereArgs = {String.valueOf(1)};
db.update("UserTbl", values, whereClause, whereArgs);
}
// 刪除
private void delete(SQLiteDatabase db){
String sql = " delete from UserTbl where _id=2 ";
db.execSQL(sql);
}
// 刪除2
private void delete2(SQLiteDatabase db){
String whereClause = "_id=?";
String[] whereArgs = {String.valueOf(1)};
db.delete("UserTbl", whereClause, whereArgs);
}
}
/Chapter09_Data_03/res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>
/Chapter09_Data_03/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.amaker.test"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
Android中的AppWidget入門教程
什麼是AppWidget?AppWidget就是我們平常在桌面上見到的那種一個個的小窗口,利用這個小窗口可以給用戶提供一些方便快捷的操作。本篇打算從以下幾個點來介
Java4Android開發教程(一)JDK安裝與配置
1、JDK:Java Development Kit,java開發工具包。http://www.oracle.com/technetwork/java/javas
android 微信 sdk api調用不成功解決方案
最近一直在調用微信的API,卻發現一直調用不成功,糾結了好久,各方面找教程,找官方,官方裡的文檔也只是寫得很模糊,說是按三步走。 1、申請App_ID
android應用開發之spinner控件的簡單使用
Android的控件有很多種,其中就有一個Spinner的控件,這個控件其實就是一個下拉顯示列表。Spinner是位於 android.widget包