編輯: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>
什麼是AppWidget?AppWidget就是我們平常在桌面上見到的那種一個個的小窗口,利用這個小窗口可以給用戶提供一些方便快捷的操作。本篇打算從以下幾個點來介
1、JDK:Java Development Kit,java開發工具包。http://www.oracle.com/technetwork/java/javas
最近一直在調用微信的API,卻發現一直調用不成功,糾結了好久,各方面找教程,找官方,官方裡的文檔也只是寫得很模糊,說是按三步走。 1、申請App_ID
Android的控件有很多種,其中就有一個Spinner的控件,這個控件其實就是一個下拉顯示列表。Spinner是位於 android.widget包