日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android官方开发文档Training系列课程中文版:数据存储之数据库存储

發布時間:2024/7/5 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android官方开发文档Training系列课程中文版:数据存储之数据库存储 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址:http://android.xsoftlab.net/training/basics/data-storage/databases.html

對于保存重復的結構化的數據最理想的方式就是存到數據庫,比如聯系人信息。這節課假定你有SQL數據庫基礎,會幫助你開始學習Android上的SQLite數據庫。你將通過使用android.database.sqlite包下API來操作數據庫。

定義架構以及契約

SQL數據庫的主要原則之一就是架構:一份數據庫組織結構的正式聲明。架構反映在SQL語句中,你可以使用它來創建數據庫。你可能會發現它對于創建一個輔助類來說是非常有幫助的。我們所已知的contract類,它明確的指明了在系統化和自我記錄化的方式下的布局模式。

contract類是一個契約容器,它定義了URI、TABLE、COLUMN的名稱。contract類允許你使用相同的契約訪問處于同一個包下的所有類。它可以使你在一個地方改了列名,然后讓這個更改消息在代碼中傳播(Tips:這里應該說的是觀察者模式)。

組織一個contract類的最好方式就是在類的根級中定義全局的數據庫。然后對每一個表都創建一個內部類并且在內部類中列舉出它的每一列列名。

Note:內部類可以通過實現BaseColumns接口,繼承一個被稱為_ID的主鍵,一些Android中的類比如cursor adapter會期望擁有這個主鍵,不過這不是必須的,但是它可以有助于數據庫在Android框架層中運行的更協調。

下面的小片段定義了一個單表,并列舉出了它表名和列名:

public final class FeedReaderContract {// To prevent someone from accidentally instantiating the contract class,// give it an empty constructor.public FeedReaderContract() {}/* Inner class that defines the table contents */public static abstract class FeedEntry implements BaseColumns {public static final String TABLE_NAME = "entry";public static final String COLUMN_NAME_ENTRY_ID = "entryid";public static final String COLUMN_NAME_TITLE = "title";public static final String COLUMN_NAME_SUBTITLE = "subtitle";...} }

使用SQL Helper創建一個數據庫

一旦定義了數據庫的模型,你應該實現可以創建并可以為維護數據庫以及表的方法。下面是創建表、刪除表的一些典型聲明:

private static final String TEXT_TYPE = " TEXT"; private static final String COMMA_SEP = ","; private static final String SQL_CREATE_ENTRIES ="CREATE TABLE " + FeedEntry.TABLE_NAME + " (" +FeedEntry._ID + " INTEGER PRIMARY KEY," +FeedEntry.COLUMN_NAME_ENTRY_ID + TEXT_TYPE + COMMA_SEP +FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +... // Any other options for the CREATE command" )"; private static final String SQL_DELETE_ENTRIES ="DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME;

就像保存在內部存儲器上的文件,Android會將你的數據庫文件保存到與應用程序有關的私有磁盤空間內。所以你的數據是安全的,因為默認情況下這塊區域是不可以被其它應用程序訪問的。

在SQLiteOpenHelper類中有一系列非常有用的API。當使用這個類的API操作數據庫的引用時,系統會潛在的執行耗時操作。所以創建和更新數據庫的時間,應該放在需要操作的時候操作,而不是在應用啟動的時候操作。你需要操作的所有事情需要通過調用getWritableDatabase()或者getReadableDatabase()來完成。

Note:因為這些操作可能會長時間運行,所以要確保調用getWritableDatabase()或getReadableDatabase()的線程是工作線程,比如使用AsyncTask或者IntentService。

為了使用SQLiteOpenHelper,需要創建SQLiteOpenHelper的一個子類然后重寫onCreate(), onUpgrade()和onOpen()回調方法。你可能還需要實現onDowngrade(),但在這里不是必須的。
下面是SQLiteOpenHelper的實現樣例,其中使用了上面所示的部分代碼:

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, int oldVersion, int newVersion) {// This database is only a cache for online data, so its upgrade policy is// to simply to discard the data and start overdb.execSQL(SQL_DELETE_ENTRIES);onCreate(db);}public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {onUpgrade(db, oldVersion, newVersion);} }

如果需要訪問數據庫,需要實例化SQLiteOpenHelper的子類:

FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper(getContext());

放置信息到數據庫

通過往insert()方法中傳遞ContentValues對象可以向數據庫中插入數據:

// Gets the data repository in write mode SQLiteDatabase db = mDbHelper.getWritableDatabase(); // Create a new map of values, where column names are the keys ContentValues values = new ContentValues(); values.put(FeedEntry.COLUMN_NAME_ENTRY_ID, id); values.put(FeedEntry.COLUMN_NAME_TITLE, title); values.put(FeedEntry.COLUMN_NAME_CONTENT, content); // Insert the new row, returning the primary key value of the new row long newRowId; newRowId = db.insert(FeedEntry.TABLE_NAME,FeedEntry.COLUMN_NAME_NULLABLE,values);

insert()方法的第一個參數是一個簡單的表名,第二個參數提供了當ContentValues為空的時候framework插入NULL值的那一列的列名(如果你想設置這個參數為”null”,那么當插入的值為空的時候framework將不會空值插入到數據庫)。

從數據庫中讀取信息

為了可以從數據庫讀取數據,應該使用query()方法,傳入你的選擇條件以及期望返回的那幾列。這個方法結合了insert()方法和update()方法的基礎,定義了你想匹配的那幾列,但并不插入數據。查詢返回的結果會在Cursor對象中。

SQLiteDatabase db = mDbHelper.getReadableDatabase(); // Define a projection that specifies which columns from the database // you will actually use after this query. String[] projection = {FeedEntry._ID,FeedEntry.COLUMN_NAME_TITLE,FeedEntry.COLUMN_NAME_UPDATED,...}; // How you want the results sorted in the resulting Cursor String sortOrder =FeedEntry.COLUMN_NAME_UPDATED + " DESC"; Cursor c = db.query(FeedEntry.TABLE_NAME, // The table to queryprojection, // The columns to returnselection, // The columns for the WHERE clauseselectionArgs, // The values for the WHERE clausenull, // don't group the rowsnull, // don't filter by row groupssortOrder // The sort order);

為了查看cursor中的每一行,需要使用Cursor的移動方法,在你開始讀取數據之前你需要一直調用這個方法。通常情況下,你應該在最開始調用moveToFirst()方法,它會將讀取位置放置到第一個結果實體所在的位置。對于每一行來說,你可以通過調用Cursor類中的其中一個方法讀取一個列值,比如使用getString(),getLong()。對于每一個get方法,你必須給這些方法傳遞一個要讀取那一列的索引位置值,你可以通過getColumnIndex()或者getColumnIndexOrThrow()獲得索引位置值:

cursor.moveToFirst(); long itemId = cursor.getLong(cursor.getColumnIndexOrThrow(FeedEntry._ID) );

從數據庫中刪除信息

如果要從數據庫表中刪除一行,你需要提供可以標識那一行的選擇條件。數據庫API提供了一種機制,用于創建選擇條件,這種機制可以防止被SQL注入。這種機制會將選擇規范劃分為選擇條件和選擇參數。選擇條件用于定義查找的列,也允許同時查找多列。選擇參數的值會測試綁定到條件上的對應值。因為結果不會像常規的SQL語句那樣被處理,它會用于免疫SQL注入的。

// Define 'where' part of query. String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?"; // Specify arguments in placeholder order. String[] selectionArgs = { String.valueOf(rowId) }; // Issue SQL statement. db.delete(table_name, selection, selectionArgs);

更新數據庫

如果需要修改數據庫值的子集,請使用update()方法。

更新表的方法結合了insert()的內容語法與delete()的where語法。

SQLiteDatabase db = mDbHelper.getReadableDatabase(); // New value for one column ContentValues values = new ContentValues(); values.put(FeedEntry.COLUMN_NAME_TITLE, title); // Which row to update, based on the ID String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?"; String[] selectionArgs = { String.valueOf(rowId) }; int count = db.update(FeedReaderDbHelper.FeedEntry.TABLE_NAME,values,selection,selectionArgs);

總結

以上是生活随笔為你收集整理的Android官方开发文档Training系列课程中文版:数据存储之数据库存储的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。