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,