安卓資料庫實例
Ⅰ 如何使用sqlite資料庫,android SQLiteOpenHelper使用實例
第一步:新建一個Android工程,命名為SQLiteDatabaseDemo.
第二步:創建一個新的類BooksDB.java這個類要繼承於android.database.sqlite.SQLiteOpenHelper抽象類,我們要實現其中兩個方法:onCreate(),onUpdate.
第三步:修改main.xml布局如下,由兩個EditText和一個ListView組成
第四步:修改SQLiteDatabaseDemo
Ⅱ android中在怎麼獲取資料庫數據
android讀取資料庫可以使用sqlite一些api進行讀取,實例如下:
/**
* 查找一條數據
* @param uid
*/
public User find(Integer uid){
SQLiteDatabase db=dbOpenHelper.getReadableDatabase(); //創建資料庫輔助類
Cursor cursor =db.rawQuery("select * from user where uid=?", new String[]{uid.toString()}); //創建一個游標
if(cursor.moveToFirst()){ //循環遍歷查找數組
int uid2=cursor.getInt(cursor.getColumnIndex("uid"));
String uname=cursor.getString(cursor.getColumnIndex("uname"));
String uaddress=cursor.getString(cursor.getColumnIndex("uaddress"));
User user=new User();
user.setUid(uid2);
user.setUname(uname);
user.setUaddress(uaddress);
return user;
}
cursor.close();
return null;
}
Ⅲ 安卓怎麼使用sqlite資料庫實例
SQPte 一個非常流行的嵌入式資料庫,它支持 SQL 語言,並且只利用很少的內存就有很好的性能。此外它還是開源的,任何人都可以使用它。許多開源項目((Mozilla, PHP, Python)都使用了 SQPte. SQPte 由以下幾個組件組成:SQL 編譯器、內核、後端以及附件。SQPte 通過利用虛擬機和虛擬資料庫引擎(VDBE),使調試、修改和擴展 SQPte 的內核變得更加方便。 圖 1. SQPte 內部結構 SQPte 基本上符合 SQL-92 標准,和其他的主要 SQL 資料庫沒什麼區別。它的優點就是高效,Android 運行時環境包含了完整的 SQPte。 SQPte 和其他資料庫最大的不同就是對數據類型的支持,創建一個表時,可以在 CREATE TABLE 語句中指定某列的數據類型,但是你可以把任何數據類型放入任何列中。當某個值插入資料庫時,SQPte 將檢查它的類型。如果該類型與關聯的列不匹配,則 SQPte 會嘗試將該值轉換成該列的類型。如果不能轉換,則該值將作為其本身具有的類型存儲。比如可以把一個字元串(String)放入 INTEGER 列。SQPte 稱這為“弱類型”(manifest typing.)。 此外,SQPte 不支持一些標準的 SQL 功能,特別是外鍵約束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FPL OUTER JOIN, 還有一些 ALTER TABLE 功能。 除了上述功能外,SQPte 是一個完整的 SQL 系統,擁有完整的觸發器,交易等等。 Android 集成了 SQPte 資料庫 Android 在運行時(run-time)集成了 SQPte,所以每個 Android 應用程序都可以使用 SQPte 資料庫。對於熟悉 SQL 的開發人員來時,在 Android 開發中使用 SQPte 相當簡單。但是,由於 JDBC 會消耗太多的系統資源,所以 JDBC 對於手機這種內存受限設備來說並不合適。因此,Android 提供了一些新的 API 來使用 SQPte 資料庫,Android 開發中,程序員需要學使用這些 API。 資料庫存儲在 data/< 項目文件夾 >/databases/ 下。 Android 開發中使用 SQPte 資料庫 Activites 可以通過 Content Provider 或者 Service 訪問一個資料庫。下面會詳細講解如果創建資料庫,添加數據和查詢資料庫。 創建資料庫 Android 不自動提供資料庫。在 Android 應用程序中使用 SQPte,必須自己創建資料庫,然後創建表、索引,填充數據。Android 提供了 SQPteOpenHelper 幫助你創建一個資料庫,你只要繼承 SQPteOpenHelper 類,就可以輕松的創建資料庫。SQPteOpenHelper 類根據開發應用程序的需要,封裝了創建和更新資料庫使用的邏輯。SQPteOpenHelper 的子類,至少需要實現三個方法: 構造函數,調用父類 SQPteOpenHelper 的構造函數。這個方法需要四個參數:上下文環境(例如,一個 Activity),資料庫名字,一個可選的游標工廠(通常是 NPl),一個代表你正在使用的資料庫模型版本的整數。 onCreate()方法,它需要一個 SQPteDatabase 對象作為參數,根據需要對這個對象填充表和初始化數據。 onUpgrage() 方法,它需要三個參數,一個 SQPteDatabase 對象,一個舊的版本號和一個新的版本號,這樣你就可以清楚如何把一個資料庫從舊的模型轉變到新的模型。 下面示例代碼展示了如何繼承 SQPteOpenHelper 創建資料庫: pubPc class DatabaseHelper extends SQPteOpenHelper { DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version) { super(context, name, cursorFactory, version); } @Override pubPc void onCreate(SQPteDatabase db) { // TODO 創建資料庫後,對資料庫的操作 } @Override pubPc void onUpgrade(SQPteDatabase db, int PdVersion, int newVersion) { // TODO 更改資料庫版本的操作 } @Override pubPc void onOpen(SQPteDatabase db) { super.onOpen(db); // TODO 每次成功打開資料庫後首先被執行 } } 接下來討論具體如何創建表、插入數據、刪除表等等。調用 getReadableDatabase() 或 getWriteableDatabase() 方法,你可以得到 SQPteDatabase 實例,具體調用那個方法,取決於你是否需要改變資料庫的內容: db=(new DatabaseHelper(getContext())).getWritableDatabase(); return (db == nPl) ? false : true; 上面這段代碼會返回一個 SQPteDatabase 類的實例,使用這個對象,你就可以查詢或者修改資料庫。 當你完成了對資料庫的操作(例如你的 Activity 已經關閉),需要調用 SQPteDatabase 的 Close() 方法來釋放掉資料庫連接。 創建表和索引 為了創建表和索引,需要調用 SQPteDatabase 的 execSQL() 方法來執行 DDL 語句。如果沒有異常,這個方法沒有返回值。 例如,你可以執行如下代碼: db.execSQL("CREATE TABLE mytable (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, value REAL);"); 這條語句會創建一個名為 mytable 的表,表有一個列名為 _id,並且是主鍵,這列的值是會自動增長的整數(例如,當你插入一行時,SQPte 會給這列自動賦值),另外還有兩列:title( 字元 ) 和 value( 浮點數 )。 SQPte 會自動為主鍵列創建索引。 通常情況下,第一次創建資料庫時創建了表和索引。如果你不需要改變表的 schema,不需要刪除表和索引 . 刪除表和索引,需要使用 execSQL() 方法調用 DROP INDEX 和 DROP TABLE 語句。 給表添加數據 上面的代碼,已經創建了資料庫和表,現在需要給表添加數據。有兩種方法可以給表添加數據。 像上面創建表一樣,你可以使用 execSQL() 方法執行 INSERT, UPDATE, DELETE 等語句來更新表的數據。execSQL() 方法適用於所有不返回結果的 SQL 語句。例如: db.execSQL("INSERT INTO widgets (name, inventory)"+ "VALUES ('Sprocket', 5)"); 另一種方法是使用 SQPteDatabase 對象的 insert(), update(), delete() 方法。這些方法把 SQL 語句的一部分作為參數。示例如下: ContentValues cv=new ContentValues(); cv.put(Constants.TITLE, "example title"); cv.put(Constants.VALUE, SensorManager.GRAVITY_DEATH_STAR_I); db.insert("mytable", getNPlCPumnHack(), cv); update()方法有四個參數,分別是表名,表示列名和值的 ContentValues 對象,可選的 WHERE 條件和可選的填充 WHERE 語句的字元串,這些字元串會替換 WHERE 條件中的“?”標記。update() 根據條件,更新指定列的值,所以用 execSQL() 方法可以達到同樣的目的。 WHERE 條件和其參數和用過的其他 SQL APIs 類似。例如: String[] parms=new String[] {"this is a string"}; db.update("widgets", replacements, "name=?", parms); delete() 方法的使用和 update() 類似,使用表名,可選的 WHERE 條件和相應的填充 WHERE 條件的字元串。 查詢資料庫 類似 INSERT, UPDATE, DELETE,有兩種方法使用 SELECT 從 SQPte 資料庫檢索數據。 1 .使用 rawQuery() 直接調用 SELECT 語句; 使用 query() 方法構建一個查詢。 Raw Queries正如 API 名字,rawQuery() 是最簡單的解決方法。通過這個方法你就可以調用 SQL SELECT 語句。例如: Cursor c=db.rawQuery( "SELECT name FROM sqPte_master WHERE type='table' AND name='mytable'", nPl); 在上面例子中,我們查詢 SQPte 系統表(sqPte_master)檢查 table 表是否存在。返回值是一個 cursor 對象,這個對象的方法可以迭代查詢結果。如果查詢是動態的,使用這個方法就會非常復雜。例如,當你需要查詢的列在程序編譯的時候不能確定,這時候使用 query() 方法會方便很多。 RegPar Queriesquery() 方法用 SELECT 語句段構建查詢。SELECT 語句內容作為 query() 方法的參數,比如:要查詢的表名,要獲取的欄位名,WHERE 條件,包含可選的位置參數,去替代 WHERE 條件中位置參數的值,GROUP BY 條件,HAVING 條件。除了表名,其他參數可以是 nPl。所以,以前的代碼段可以可寫成: String[] cPumns={"ID", "inventory"}; String[] parms={"snicklefritz"}; Cursor resPt=db.query("widgets", cPumns, "name=?",parms, nPl, nPl, nPl); 使用游標不管你如何執行查詢,都會返回一個 Cursor,這是 Android 的 SQPte 資料庫游標,使用游標,你可以:通過使用 getCount() 方法得到結果集中有多少記錄;通過 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍歷所有記錄;通過 getCPumnNames() 得到欄位名;通過 getCPumnIndex() 轉換成欄位號;通過 getString(),getInt() 等方法得到給定欄位當前記錄的值;通過 requery() 方法重新執行查詢得到游標;通過 close() 方法釋放游標資源;例如,下面代碼遍歷 mytable 表 Cursor resPt=db.rawQuery("SELECT ID, name, inventory FROM mytable"); resPt.moveToFirst(); while (!resPt.isAfterLast()) { int id=resPt.getInt(0); String name=resPt.getString(1); int inventory=resPt.getInt(2); // do something usefP with these resPt.moveToNext(); } resPt.close(); 在 Android 中使用 SQPte 資料庫管理工具 在其他資料庫上作開發,一般都使用工具來檢查和處理資料庫的內容,而不是僅僅使用資料庫的 API。使用 Android 模擬器,有兩種可供選擇的方法來管理資料庫。首先,模擬器綁定了 sqPte3 控制台程序,可以使用 adb shell 命令來調用他。只要你進入了模擬器的 shell,在資料庫的路徑執行 sqPte3 命令就可以了。資料庫文件一般存放 在:/data/data/your.app.package/databases/your-db-name如果你喜歡使用更友好的工具,你 可以把資料庫拷貝到你的開發機上,使用 SQPte-aware 客戶端來操作它。這樣的話,你在一個資料庫的拷貝上操作,如果你想要你的修改能反映到設備上,你需要把資料庫備份回去。把資料庫從設備上考出來,你可以使 用 adb pPl 命令(或者在 IDE 上做相應操作)。存儲一個修改過的資料庫到設備上,使用 adb push 命令。一個最方便的 SQPte 客戶端是 FireFox SQPte Manager 擴展,它可以跨所有平台使用。 圖 2. SQPte Manager 結束語 如果你想要開發 Android 應用程序,一定需要在 Android 上存儲數據,使用 SQPte 資料庫是一種非常好的選擇。本文介紹了如何在 Android 應用程序中使用 SQPte 資料庫 ,主要介紹了在 Android 應用程序中使用 SQPte 創建資料庫和表、添加數據、更新和檢索數據,還介紹了比較常用的 SQPte 管理工具,通過閱讀本文,你可以在 Android 中輕松操作 SQPte 資料庫。
Ⅳ android 資料庫建好後,怎麼建表
SQLite 創建表
下面是教程來自於android學習手冊,android學習手冊包含9個章節,108個例子,源碼文檔隨便看,例子都是可交互,可運行,源碼採用android studio目錄結構,高亮顯示代碼,文檔都採用文檔結構圖顯示,可以快速定位。360手機助手中下載,圖標上有貝殼
SQLite 的 CREATE TABLE 語句用於在任何給定的資料庫創建一個新表。創建基本表,涉及到命名表、定義列及每一列的數據類型。
語法
CREATE TABLE 語句的基本語法如下:
CREATE TABLE database_name.table_name(
column1 datatype PRIMARY KEY(one or more columns),
column2 datatype,
column3 datatype,
.....
columnN datatype,
);
CREATE TABLE 是告訴資料庫系統創建一個新表的關鍵字。CREATE TABLE 語句後跟著表的唯一的名稱或標識。您也可以選擇指定帶有table_name 的 database_name。
實例
下面是一個實例,它創建了一個 COMPANY 表,ID 作為主鍵,NOT NULL 的約束表示在表中創建紀錄時這些欄位不能為 NULL:
sqlite> CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
讓我們再創建一個表,我們將在隨後章節的練習中使用:
sqlite> CREATE TABLE DEPARTMENT(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
);
您可以使用 SQLIte 命令中的 .tables 命令來驗證表是否已成功創建,該命令用於列出附加資料庫中的所有表。
sqlite>.tables
COMPANY DEPARTMENT
在這里,可以看到我們剛創建的兩張表 COMPANY、 DEPARTMENT。
您可以使用 SQLite .schema 命令得到表的完整信息,如下所示:
sqlite>.schema COMPANY
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
Ⅳ 求幫助,android實例化資料庫問題
在上一個例子中,我們對Android系統自帶的SQLite資料庫進行了初步的學習,了解了一些增、刪、改、查的基本工作。在這一節的例子當中,我們做了一個非常簡便的日記本程序,雖然沒有完善,但是已經是基本可以使用了。在例子當中,我們不但要對資料庫進行增、刪、改、查的操作,而且還要把資料庫當中的數據顯示在一個ListView當中,通過對ListView的操作,實現對數據的增、刪、改、查操作。
通過這個例子我們可以學到以下操作:
如何對DatabaseHelper和SQLiteDatabase封裝,以便讓我們訪問資料庫更加方便和安全;
如何利用ContentValues類來代替原始的SQL語句進行資料庫的操作;
如何使用SimpleCursorAdapter類和ListView配合進行ListView的顯示。
日記本具體實現步驟如下所述。
1.第一步
在Eclipse中打開ex08_2_SQLite 項目,具體操作步驟如下。
新建一個項目。單擊File→New→Android Project項。
在新建項目的對話框中,選擇Create project from existing source項。
單擊瀏覽,找到ex08_2_SQLite項目,然後單擊確定。
程序的目錄結構如圖8-16所示。
2.第二步
我們首先運行一下建立的程序,將會出現如圖8-17所示。
(點擊查看大圖)圖8-16 程序的目錄結構
(點擊查看大圖)圖8-17 沒有任何數據的程序主界面
程序的主Activity是ActivityMain,它是一個ListActivity,和它關聯的布局文件是diary_list.xml。關於ListActivity的介紹。請參閱第7章關於ListView的介紹。
3.第三步
在繼續操作前,讓我們重點關注一下DiaryDbAdapter類,這個類封裝了DatabaseHelper和SQLiteDatabase類,使得我們對資料庫的操作更加安全和方便。
在DiaryDbAdapter的類變數里,主要定義了以下幾個變數:
資料庫、數據表、數據表中列的名字;
DatabaseHelper 和SQLiteDatabase的實例;
Context 實例。
DatabaseHelper 類的定義和上一個例子一樣,只不過這個例子里邊,我們在onUpgrade增加了升級的代碼,具體如下所示:
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(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) {
db.execSQL("DROP TABLE IF EXISTS diary");
onCreate(db);
}
}
代碼解釋:
在DiaryDbAdapter類里,向外界提供了以下一些方法。
open(),調用這個方法後,如果資料庫還沒有建立,那麼會建立資料庫,如果資料庫已經建立了,那麼會返回可寫的資料庫實例。
close(),調用此方法,DatabaseHelper 會關閉對資料庫的訪問。
createDiary(String title, String body)通過一個title和body欄位在資料庫當中創建一條新的紀錄。
deleteDiary(long rowId)通過記錄的id,刪除資料庫中的那條記錄。
getAllNotes()得到diary表中所有的記錄,並且以一個Cursor的形式進行返回。
getDiary(long rowId)通過記錄的主鍵id,得到特定的一條記錄。
updateDiary(long rowId, String title, String body)更新主鍵id為rowId那條記錄中的兩個欄位title和body欄位的內容。
小知識 什麼是ContentValues類?
ContentValues類和Hashtable比較類似,它也是負責存儲一些名值對,但是它存儲的名值對當中的名是一個String類型,而值都是基本類型。
我們回顧一下,在上一個例子當中,我們是通過SQL語句進行插入操作,SQL語句的好處是比較直觀,但是容易出錯。但是在這個例子當中我們有更好的辦法,在這里我們將要插入的值都放到一個ContentValues的實例當中,然後執行插入操作,具體代碼如下所示:
public long createDiary(String title, String body) {
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_BODY, body);
Calendar calendar = Calendar.getInstance();
// 生成年月日字元串
String created = calendar.get(Calendar.YEAR)
+"年"+calendar.get(Calendar. MONTH)+"月"+calendar.get
(Calendar.DAY_OF_MONTH)+"日"+calendar.get(Calendar.
HOUR_OF _DAY)+"時"+calendar.get(Calendar.MINUTE)+"分";
initialValues.put(KEY_CREATED, created);
return mDb.insert(DATABASE_TABLE, null, initialValues);
}
代碼解釋:
ContentValues initialValues = new ContentValues()語句實例化一個contentValues類。
initialValues.put(KEY_TITLE, title)語句將列名和對應的列值放置到initialValues里邊。
mDb.insert(DATABASE_TABLE, null, initialValues)語句負責插入一條新的紀錄,如果插入成功則會返回這條記錄的id,如果插入失敗會返回-1。
在更新一條記錄的時候,我們也是採用ContentValues 的這套機制,具體代碼如下所示:
public boolean updateDiary(long rowId, String title, String body) {
ContentValues args = new ContentValues();
args.put(KEY_TITLE, title);
args.put(KEY_BODY, body);
Calendar calendar = Calendar.getInstance();
String created = calendar.get(Calendar.YEAR) + "年"
+ calendar.get(Calendar.MONTH) + "月"
+ calendar.get(Calendar.DAY_OF_MONTH) + "日"
+ calendar.get(Calendar.HOUR_OF_DAY) + "時"
+ calendar.get(Calendar.MINUTE) + "分";
args.put(KEY_CREATED, created);
return mDb.update(DATABASE_TABLE, args,
KEY_ROWID + "=" + rowId, null) > 0;
}
代碼解釋:
實現更新一條記錄。
4.第四步
現在返回到程序的主界面,對應的Activity是ActivityMain。
當我們單擊menu按鈕後會出現如圖8-18所示界面。
根據我們第7章對menu的學習,對單擊menu里邊按鈕的處理邏輯全部放在onMenuItem Selected函數里,具體代碼如下所示:
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case INSERT_ID:
createDiary();
return true;
case DELETE_ID:
mDbHelper.deleteDiary(getListView().getSelectedItemId());
renderListView();
return true;
}
return super.onMenuItemSelected(featureId, item);
}
代碼解釋:
如果單擊添加一篇新日記按鈕那麼會執行到createDiary()語句。
如果單擊刪除一條記錄,會執行mDbHelper.deleteDiary(getListView().getSelectedItemId())語句,首先刪除當前被選中的某一項所對應的資料庫當中的記錄。
renderListView()語句重新對界面刷新。
在createDiary()函數里邊的代碼如下所示:
private void createDiary() {
Intent i = new Intent(this, ActivityDiaryEdit.class);
startActivityForResult(i, ACTIVITY_CREATE);
}
代碼解釋:
首先構造了一個intent,這個intent負責跳轉到ActivityDiaryEdit里。
然後啟動這個intent,並且需要返回值。
5.第五步
在ActivityMain中,有多處地方都用到了renderListView()函數。在onCreate里邊用這個函數顯示ListView。當ListView需要發生變化後,例如,刪除了一條記錄或者增加了一條記錄的時候,我們調用這個函數進行刷新ListView,下邊來看一下此函數的實現,具體代碼如下所示:
private void renderListView() {
mDiaryCursor = mDbHelper.getAllNotes();
startManagingCursor(mDiaryCursor);
String[] from = new String[] { DiaryDbAdapter.KEY_TITLE,
DiaryDbAdapter.KEY_CREATED };
int[] to = new int[] { R.id.text1, R.id.created };
SimpleCursorAdapter notes = new SimpleCursorAdapter(this,
R.layout.diary_row, mDiaryCursor, from, to);
setListAdapter(notes);
}
代碼解釋:
mDiaryCursor = mDbHelper.getAllNotes()語句,我們首先獲取資料庫當中的所有數據,這些數據以Cursor的形式存在。
startManagingCursor(mDiaryCursor)語句,我們將生成的Cursor交給Activity來管理,這樣的好處是系統能自動做很多事情,比如當程序暫停的時候,這個系統可以卸載Cursor以節省空間,當程序重新啟動的時候系統重新查詢生成Cursor。
String[] from 里邊定義了ListView每一排對應的數據是從資料庫中的哪個列表裡選取。
和SimpleAdapter類似 int[] to 里邊是一個View的數組。這些View只能是TextView或者ImageView。這些View是以id的形式來表示的,如Android.R.id.text1。
SimpleCursorAdapter notes = new SimpleCursorAdapter(this,R.layout.diary_row, mDiaryCursor, from, to)語句生成一個SimpleCursorAdapter ,我們介紹以下每一個參數的意義。
第一個參數是Context。
第二個參數為R.layout.diary_row,它關聯在diary_row.xml文件當中定義的Layout,這個Layout規定ListView當中每一項的布局。
第三個參數就是Cursor。
第四個參數是數據表當中的列的數組,只有在這里邊出現的列名,數據才會對應的填充在to里邊對應的TextView或者ImageView當中。
第五個參數是在ListView里邊每一項中需要被數據填充的TextView或者ImageView。
setListAdapter(notes)語句將SimpleCursorAdapter 和ListActivity里邊的ListView綁定起來,至此在界面當中才會顯示出列表來。
小知識 什麼是SimpleCursorAdapter ?
在第7章,我們已經介紹過了ArrayAdapter和SimpleAdapter。和它們倆類似,SimpleCursorAdapter 也是集成Adapter。ArrayAdapter負責把一個字元串數組中的數據填充到一個ListView當中,而對應的SimpleCursorAdapter 負責把Cursor里邊的內容填充到ListView當中。通過SimpleCursorAdapter 可以把資料庫當中一列的數據和ListView中一排進行對應起來。和前兩個Adapter類似,要求和數據進行對應的View必須是TextView或者ImageView。
6.第六步
單擊添加一條數據的按鈕,程序運行界面如圖8-19所示。
這個界面對應的Activity是ActivityDiaryEdit,對應的布局文件是diary_edit.xml。對於這個布局文件里邊用到了LinearLayout、TextView和EditText,這些我們都已經講過,在這里不再贅述,具體看一下代碼:
<?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">
<LinearLayout Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content">
<TextView Android:layout_width="wrap_content"
Android:layout_height="wrap_content" Android:text="@string/title"
Android:padding="2px" />
<EditText Android:id="@+id/title"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content" Android:layout_weight="1" />
</LinearLayout>
<TextView Android:layout_width="wrap_content"
Android:layout_height="wrap_content" Android:text="@string/body" />
<EditText Android:id="@+id/body" Android:layout_width="fill_parent"
Android:layout_height="wrap_content" Android:layout_weight="1"
Android:scrollbars="vertical" />
<Button Android:id="@+id/confirm" Android:text="@string/confirm"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
</LinearLayout>
代碼解釋:
在一個LinearLayout里邊我們放置了一些文本框、輸入框和一些Button按鈕。
當程序運行輸入內容後,單擊確定按鈕,日記就會保存到資料庫當中。下邊來看一下代碼具體是怎麼執行的。當單擊確定按鈕後,系統回調執行和按鈕綁定的單擊監聽器里邊的onClick方法,具體代碼如下所示:
public void onClick(View view) {
String title = mTitleText.getText().toString();
String body = mBodyText.getText().toString();
if (mRowId != null) {
mDbHelper.updateDiary(mRowId, title, body);
} else
mDbHelper.createDiary(title, body);
Intent mIntent = new Intent();
setResult(RESULT_OK, mIntent);
finish();
}
代碼解釋:
首先獲得EditView里邊的數據。
目前mRowId 為null,所以執行mDbHelper.createDiary(title, body)語句將數據保存到數據當中。
setResult(RESULT_OK, mIntent)語句設置返回值。
執行完上邊的代碼後,系統跳轉到ActivityMain,並執行回調函數onActivityResult,具體代碼如下所示:
protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
renderListView();
}
代碼解釋:
在回調函數中,我們重新對ListView進行刷新,將所有的數據重新顯示出。
7.第七步
單擊ListView里邊的條列,可以對剛才保存的數據進行編輯。具體怎麼實現這個功能的,我們可以看一下ActivityMain當中的onListItemClick方法代碼:
protected void onListItemClick(ListView l,
View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Cursor c = mDiaryCursor;
c.moveToPosition(position);
Intent i = new Intent(this, ActivityDiaryEdit.class);
i.putExtra(DiaryDbAdapter.KEY_ROWID, id);
i.putExtra(DiaryDbAdapter.KEY_TITLE, c.getString
(c .getColumnIndexOrThrow(DiaryDbAdapter.KEY_TITLE)));
i.putExtra(DiaryDbAdapter.KEY_BODY, c.getString
(c .getColumnIndexOrThrow(DiaryDbAdapter.KEY_BODY)));
startActivityForResult(i, ACTIVITY_EDIT);
}
代碼解釋:
c.moveToPosition(position)語句將在Cursor當中的指針移到position位置,這個position是我們單擊的這個一列在整個列表中的位置。
Intent i = new Intent(this, ActivityDiaryEdit.class)語句構造一個跳轉到ActivityDiaryEdit的intent。
putExtra()方法負責將要傳遞的數據放到intent當中。
c.getString(c.getColumnIndexOrThrow(DiaryDbAdapter.KEY_TITLE))得到這一條數據中列名為title的值。
c.getString(c.getColumnIndexOrThrow(DiaryDbAdapter.KEY_BODY))得到這一條數據中列名為body的值。
startActivityForResult(i, ACTIVITY_EDIT)語句啟動intent,發生Activity的跳轉。
我們來看一下ActivityDiaryEdit中的onCreate()里邊的代碼:
Bundle extras = getIntent().getExtras();
if (extras != null) {
String title = extras.getString(DiaryDbAdapter.KEY_TITLE);
String body = extras.getString(DiaryDbAdapter.KEY_BODY);
mRowId = extras.getLong(DiaryDbAdapter.KEY_ROWID);
if (title != null) {
mTitleText.setText(title);
}
if (body != null) {
mBodyText.setText(body);
}
}
代碼解釋:
對於ActivityDiaryEdit這個Activity有兩個intent可以跳轉進來,一個是新建一篇日記的時候,這個時候intent里邊的extras部分沒有任何數據。第二種情況是在單擊列表的某一個條列的時候,這個時候的intent如上所示會攜帶extras數據。所以在ActivityDiaryEdit中我們通過判斷extras是否為null,就可以判斷是哪種intent啟動的。
當extras不為null,我們將extras里邊的數據顯示出來。
8.第八步
在程序的主界面當中,上下移動焦點(可以通過鍵盤的上下鍵或者模擬器中的上下按鍵),可以對擁有焦點的那一項進行刪除,如圖8-20、圖8-21、圖8-22所示。
(點擊查看大圖)圖8-20 上下移動焦點界面
具體執行onMenuItemSelected中的代碼:
mDbHelper.deleteDiary(getListView().getSelectedItemId());
renderListView();
代碼解釋:
getListView()方法獲取當前的ListView引用。
getSelectedItemId()方法得到當前這一列所對應的數據項的rowId,也就是這條數據在資料庫中的主鍵id。
(點擊查看大圖)圖8-21 進行刪除界面
(點擊查看大圖)圖8-22 刪除後界面
mDbHelper.deleteDiary()方法刪去資料庫中的這一列數據。
renderListView()負責對列表重新刷新一遍。
至此,對資料庫的學習就先告一段落,接下來將學習contentProvider,它是Android應用當中非常重要的一部分。而且程序間的大部分數據交換都是通過contentProvider機制進行。
Ⅵ android 怎麼調用資料庫方法
SQLite也支持SQL標准類型,VARCHAR、CHAR、BIGINT等。
創建資料庫
Android 不自動提供資料庫。在 Android 應用程序中使用 SQLite,必須自己創建資料庫,然後創建表、索引,填充數據。Android 提供了 SQLiteOpenHelper 幫助你創建一個資料庫,只要繼承 SQLiteOpenHelper 類,就可以創建資料庫。繼承了SQLiteOpenHelper的子類,必須實現三個方法:
1、構造函數,調用父類 SQLiteOpenHelper 的構造函數。這個方法需要四個參數:上下文環境(例如,一個 Activity),資料庫名字,一個可選的游標工廠(通常是 Null),一個代表你正在使用的資料庫模型版本的整數。
2、onCreate()方法,它需要一個 SQLiteDatabase 對象作為參數,根據需要對這個對象填充表和初始化數據。
3、onUpgrage() 方法,它需要三個參數,一個 SQLiteDatabase 對象,一個舊的版本號和一個新的版本號,這樣可以清楚如何把一個資料庫從舊的模型轉變到新的模型。
Ⅶ Android中對資料庫進行條件查詢
android讀取資料庫可以使用sqlite一些api進行讀取,實例如下:
/**
*
查找一條數據
*
@param
uid
*/
public
user
find(integer
uid){
sqlitedatabase
db=dbopenhelper.getreadabledatabase();
//創建資料庫輔助類
cursor
cursor
=db.rawquery("select
*
from
user
where
uid=?",
new
string[]{uid.tostring()});
//創建一個游標
if(cursor.movetofirst()){
//循環遍歷查找數組
int
uid2=cursor.getint(cursor.getcolumnindex("uid"));
string
uname=cursor.getstring(cursor.getcolumnindex("uname"));
string
uaddress=cursor.getstring(cursor.getcolumnindex("uaddress"));
user
user=new
user();
user.setuid(uid2);
user.setuname(uname);
user.setuaddress(uaddress);
return
user;
}
cursor.close();
return
null;
}
Ⅷ 安卓app 怎麼連接mysql
android 鏈接mysql資料庫實例:
package com.hl;
import java.sql.DriverManager;
import java.sql.ResultSet;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class AndroidMsql extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
sqlCon();
}
});
}
private void mSetText(String str){
TextView txt=(TextView)findViewById(R.id.txt);
txt.setText(str);
}
private void sqlCon(){
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
try {
String url ="jdbc:mysql://192.168.142.128:3306/mysql?user=zzfeihua&password=12345&useUnicode=true&characterEncoding=UTF-8";//鏈接資料庫語句
Connection conn= (Connection) DriverManager.getConnection(url); //鏈接資料庫
Statement stmt=(Statement) conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from user";//查詢user表語句
ResultSet rs=stmt.executeQuery(sql);//執行查詢
StringBuilder str=new StringBuilder();
while(rs.next()){
str.append(rs.getString(1)+"\n");
}
mSetText(str.toString());
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
不過eclipse老是提示:
warning: Ignoring InnerClasses attribute for an anonymous inner class that doesn't come with an associated EnclosingMethod attribute. (This class was probably proced by a broken compiler.)
Ⅸ android怎麼連接mysql資料庫
用Android程序去直連MySQL資料庫,覺得這樣做不好,出於安全等方面考慮。資料庫地址,用戶名密碼,查詢SQL什麼的都存在程序里,很容易被反編譯等方法看到。
建議把表示層和數據層邏輯分開,數據層對應網頁的表示層提供介面,同時在為Android手機端提供一個介面,簡介訪問資料庫,這介面可以2端都保持一致,比如XML+RPC或者json等等,Android端也有現成的東西能直接用,既安全又省事。
android 鏈接mysql資料庫實例:
package com.hl;
import java.sql.DriverManager;
import java.sql.ResultSet;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class AndroidMsql extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
sqlCon();
}
});
}
private void mSetText(String str){
TextView txt=(TextView)findViewById(R.id.txt);
txt.setText(str);
}
private void sqlCon(){
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
try {
String url ="jdbc:mysql://192.168.142.128:3306/mysql?user=zzfeihua&password=12345&useUnicode=true&characterEncoding=UTF-8";//鏈接資料庫語句
Connection conn= (Connection) DriverManager.getConnection(url); //鏈接資料庫
Statement stmt=(Statement) conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from user";//查詢user表語句
ResultSet rs=stmt.executeQuery(sql);//執行查詢
StringBuilder str=new StringBuilder();
while(rs.next()){
str.append(rs.getString(1)+"\n");
}
mSetText(str.toString());
rs.close();