1. 程式人生 > >Android 首次建立資料庫或者更新時,SQLiteOpenHelper的使用與解析

Android 首次建立資料庫或者更新時,SQLiteOpenHelper的使用與解析

本文主要是說明Android提供的資料庫建立以及更行助手SQLiteOpenHelper的初次使用以及具體方法解析。
首先談談SQLiteOpenHelper的由來,在我們首次安裝App時需要新建一些本地資料表,而這些表只需要在第一次開啟軟體時才需要執行,在下一次就不需要新建了,就像App的歡迎介面,只會在首次開啟APP時才會出現。或者是在軟體升級時,可能需要更新一些表,比如刪除舊錶,新增新的本地表,SQLiteOpenHelper就是為解決這類問題而生。
說完用途,在來分析一下SQLiteOpenHelper這個類,在繼承這個類時,需要實現


public class
MySQLiteOpenHelp extends SQLiteOpenHelper {
//新建一個SQLiteOpenHelper的物件,在之後初始化時會用到 public static MySQLiteOpenHelp mySQLiteOpenHelp; // 資料庫版本號,在更新時系統便是根據version來判斷,若version號低於則會啟動升級程式 private static final int version = 1; //設定你自己的資料庫名稱 public static final String DATABASE_NAME = "companyWorkManager.db"
; //這是在初始化之後有增、刪、改、查之後的需要時,需要借組SQLiteDatabase來進行操作 private static SQLiteDatabase dbForWrite; private static SQLiteDatabase dbForRead; //這裡是構造方法,主要實現SQLiteOpenHelper的初始化工作,注意:若SQLiteOpenHelper沒有初始化,則在使用時會報空指標異常 //即,需要明確指出Context即環境,否則會報NULLPOINT錯誤 //這是系統提供的初始化構造方法,你也可以使用蝦下面的構造方法來實現資料庫自己命名
public MySQLiteOpenHelp(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } //自定義初始化方法,這樣你就可以動態修改本地的資料庫名稱,一目瞭然。 public MySQLiteOpenHelp(Context context) { super(context, DATABASE_NAME, null, version); } //初始化資料庫位置,給了一個簡單的建立例項。 @Override public void onCreate(SQLiteDatabase db) { String TABLECONTACTS = "create table contacts(" + "_id INTEGER ," + // rowID "name TEXT NOT NULL," + // 姓名 "contactIcon BLOB," + // 聯絡人圖示 "telPhone TEXT NOT NULL," + // 電話號碼 "groupName TEXT," + // 所屬組名 "birthday TEXT," + // 生日 "address TEXT," + // 地址 "email TEXT," + // 郵箱 "description TEXT," + // 好友描述 "createTime TEXT," + // 建立時間 "modifyTime TEXT" + // 修改時間 ");"; db.execSQL(TABLECONTACTS); } //軟體更新時升級資料庫的位置 @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { } // 更新app時會載入該方法 @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { } // 建立或開啟一個數據庫。這和getWritableDatabase()返回的物件是同一個, // 除非一些因素要求資料庫只能以read-only的方式被開啟,比如磁碟滿了。 // 在這種情況下,一個只讀的資料庫物件將被返回。如果這個問題被修改掉,將來呼叫getWritableDatabase()就可能成功,而這時read-only資料庫物件將被關閉,並且讀寫物件將被返回。 public static SQLiteDatabase getReadDatabase() { if (dbForRead == null) { dbForRead = mySQLiteOpenHelp.getReadableDatabase(); } return dbForRead; } // 建立或開啟一個數據庫,用於讀寫。該方法第一次被呼叫的時候,資料庫被開啟,並且onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int) // 或onOpen(SQLiteDatabase)將被呼叫。 public static SQLiteDatabase getWriteDatabase() { if (dbForWrite == null) { dbForWrite = mySQLiteOpenHelp.getWritableDatabase(); } return dbForWrite; } }

好了,我們已經建立了一個繼承SQLiteOpenHelper類的資料庫初始化類,由於初始化需要Context物件,即上下文環境,這時就需要在對應的Activity中加入初始化方法,我的在MainActivity

    // 初始化資料庫
                    MySQLiteOpenHelp.mySQLiteOpenHelp = new MySQLiteOpenHelp(
                            MainActivity.this);
新增這一段方法就可以實現資料庫的初始化了,再次執行時,MySQLiteOpenHelp中的Oncreat()的方法是不會執行的,所以不必擔心再次建表的錯誤.
資料表初始化完成了,那麼需要增、刪、改、查操作怎麼進行呢,這就需要用到SQLiteDatabase這個類了,是用於Android平臺的資料庫操作類。你可以新建一個獨立的資料庫操作類,我的是
public class MyDBOperation {

    //相當於請求一個可以操作資料庫的許可權,得到之後你就可以操作了
    SQLiteDatabase db = MySQLiteOpenHelp.getReadDatabase();

    //這是相應的插入方法,你可以在下面新增額外的資料操作
    public void insert_groups(MyGroups contactInfo) {
        String formatTime=getSysNowTime();
        ContentValues content=new ContentValues();
        content.put("_id", contactInfo.getId());
        content.put("name", contactInfo.getName());
        content.put("birthday", contactInfo.getBirthday());
        content.put("address", contactInfo.getAddress());
        content.put("telPhone", contactInfo.getTelPhone());
        content.put("email", contactInfo.getEmail());
        content.put("contactIcon", contactInfo.getContactIcon());
        content.put("description", contactInfo.getDescription());
        content.put("groupName", contactInfo.getGroupName());
        content.put("createTime", contactInfo.getCreateTime());
        content.put("modifyTime", contactInfo.getModifyTime());
        return db.insert(TABLE_CONTACTS, null, content);
    }
}

在主表中使用時,你需要新建一個物件來實現方法

MyDBOperation db = new MyDBOperation();
db.insert_groups(tempGroup);

就可以將記錄存入到本地資料庫中去了,不清楚的需要多動手練習。
千萬不要忘了SQLiteOpenHelper的初始化,需要把上下文環境給他 他才能初始化,否則會報空指標異常。
予人玫瑰,手有餘香,知道這句出處的就會明白在那苦逼考研日子裡,多希望在王道能獲得多一點幫助的心情,願此文能給你Android學習一點幫助。

相關推薦

Android 首次建立資料庫或者更新SQLiteOpenHelper的使用解析

本文主要是說明Android提供的資料庫建立以及更行助手SQLiteOpenHelper的初次使用以及具體方法解析。 首先談談SQLiteOpenHelper的由來,在我們首次安裝App時需要新建一些本地資料表,而這些表只需要在第一次開啟軟體時才需要執行

Android中當資料庫需要更新我們該怎麼辦

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

嘗試從資料庫進行更新遇到“System.InvalidOperationException”的異常。異常訊息為:“此事務中涉及的XmlModel不能編輯”。

將vs2017建立的web專案新增到TFS後,採用從資料庫更新模型時,出現此異常。 推測是由於在TFS下,程式碼更新需要首先將程式碼遷出然後進行編輯,而從資料庫更新模型時由vs自動更新程式碼資料,可能在此過程中未能遷出或者說獲取到更新某檔案的許可權,然後更新出錯

解決:Android使用自帶sqlite開發apk中建立資料庫外部的程序是沒有許可權去讀/寫的而且無法如何讀取指定目錄下的db檔案

SQLiteOpenHelper是Android框架為我們提供的一個非常好的資料庫開啟、升級與關閉的工具類。但是這個工具類會自動把db檔案建立到“ /data/data/com.*.*(package name)/” 目錄下,這麼做可能是與Android檔案系統的設計思路

Android APP自動更新跳轉到安裝介面出現解析失敗

1、記錄一個問題,Android APP自動更新時,跳轉到安裝介面時出現解析失敗,解決辦法: 原因是下載檔案的許可權不正確 因為安裝時會跳轉到其他應用,其他應用沒有改檔案的讀寫許可權 Intent intent = new Intent(Intent.ACTION_VIEW); in

SQL不同伺服器資料庫之間資料操作(當在一個伺服器的某張表中有資料更新更新值通過觸發器插入到另一個伺服器的指定表中)

第一步:在建立觸發器的伺服器上建立連結伺服器 建立連結伺服器有兩種方法:1.通過SQL語言建立,2.通過資料庫管理工具建立,下面分別進行詳細介紹: 1.通過SQL語言建立 通過SQL語言建立連結伺服器方法 2.通過資料庫管理工具建立(這裡以SQL SER

Android集成一個新產品lunch的product name和device name註意事項

相關 oca end col 全部 article cut 返回 開發 Android系統lunch一個當前的Product大概流程包括下面幾個部分:1. lunch確定TARGET_PRODUCT。一般位於vendor/device/build/target/produ

MySQL可重復讀采坑記錄-對事務B進行更新事務A提交的更新會不會影響到事務B

但是 start clas 行數 通過 基礎上 transacti 隔離 delete 之前線上出現數據重復插入的問題,通過對問題進行排查發現該問題和MySQL的默認隔離級別-Repeatable Read(可重讀)有關系,可重復讀確保同一事務的多個實例在並發讀取數據時,會

VS 嘗試從數據庫進行更新遇到類型為“Microsoft.VSDesigner.Data.Local.ConnectionStringConverterServiceException”的異常。異常消息為:“”;

design 運行 oca sig cee 模型 新的 安裝完成 exc 最近,由於更換機器,在新機器上運行更新數據庫模型,報錯: 嘗試從數據庫進行更新時,遇到類型為“Microsoft.VSDesigner.Data.Local.ConnectionStringConve

當cell中有UItextfiled或者UITextVIew彈出鍵盤把tableview往上,但是有的cell沒有移動

方法 observer name self obj 判斷 http uia ati cell中有UITextView時,輸入文字是需要將tableView向上移,基本的做法是,註冊鍵盤變化的通知在通知的方法中做tableVIew的位置調整, 一,一般做法 - (void)r

在ubuntu更新出現錯誤E: Some index files failed to download, they have been ignored, or old ones used inst

http://www.songyawei.cn/content/3479   在ubuntu更新時,出現錯誤E: Some index files failed to download, they have been ignored, or old ones used inst

使用eclipse或者myeclipse滑鼠變成黑色十字架解決辦法

   在使用eclipse或者myeclipse時,已經不是一兩次碰到這個情況了,滑鼠箭頭變成黑色十字架,其實變成那樣不礙事,但是總感覺不大自在,我鬱悶了好久,其實這只是一個很簡單的手誤,可能是你在格式化程式碼的時候按錯了快捷鍵造成的,遇到此問題,一鍵搞定:ALT+SHIFT+A

mysql資料庫分表使用mybatis動態設定表名

mybatis中傳遞引數一般使用#{},但是當引數是表名時#{}就會報錯。這是為啥呢? 這是因為#{ } 解析為一個 JDBC 預編譯語句(prepared statement)的引數標記符。 簡單來講:select * from user_#{tableVersion} 會被解析為

Idea 建立spring mvc專案在add framework support中找不到spring選項

每次建立spring專案最頭疼就是spring的配置檔案,尤其是配置頭資訊。通過IDEA工具可以很好輔助完整這些工作。 先說下這個選項的作用:其作用就是利用IDEA自身提供的功能幫你完成一些spring的配置,幫你快速搭建網站。 從這個角度出發,如果出現如題的問題,那應該從IDEA自身上找原因。原因有二:

Android使用系統DownloadManager下載更新軟體並自動跳轉到安裝頁面

介紹:https://www.jianshu.com/p/7ad92b3d9069 1.下載apk /* * 下載apk * @param context * @param title 通知的標題 * @param url 下載的地址 * @param id 返回一個加入下載佇列的i

Android 6.0動態申請許可權許可權框閃一下就消失的問題;

Android 藍芽BLE開發需要位置許可權,不然掃描不到周圍的藍芽資訊; 位置許可權申請: if (Build.VERSION.SDK_INT < 23){return;} //判斷是否有許可權 if (ContextCompat.checkSelfPermis

Android之——使用Android studio建立的AIDL編譯找不到自定義類的解決辦法

使用AS建立ADIL檔案時AS會在main資料夾下給我們生成一個aidl資料夾和一個相同包名的包,通常我們會把所有和ADIL相關的類或檔案放在這個包下,但是如果存在自定義的類時,程式編譯時無法通過,提示找不到自定義的包。解決辦法如下,在啟動Module的build.gra

android json在不確定key獲取key跟value的值

動態獲取key和value private void check(){ String s = "{" + "\"com.pm.zse\": {" + "\"check\": fals

Android 多層fragment 巢狀viewPager不顯示的問題

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/zkll200/article/details/73692518 先看一段錯誤程式碼,這段程式碼寫在一個 Fragment 中: private void initVi

使用eclipse或者myeclipse滑鼠變成黑色十字架解決辦法[轉]

在使用eclipse或者myeclipse時,已經不是一兩次碰到這個情況了,滑鼠箭頭變成黑色十字架,其實變成那樣不礙事,但是總感覺不大自在,我鬱悶了好久,其實這只是一個很簡單的手誤,可能是你在格式化程式碼的時候按錯了快捷鍵造成的,遇到此問題,一鍵搞定:ALT+SHIFT+A,