1. 程式人生 > >Kotlin安卓開發:匯入外部資料庫

Kotlin安卓開發:匯入外部資料庫

  1. 涉及到內部資料庫的建立使用。
  2. 外部資料庫的匯入。
  3. kotlin的檔案讀寫。

最近在寫一個學習資料類的應用。

現在寫到題庫部分。

思路是:事先準備好外部的資料庫(就是題庫了),然後,程式第一次執行時候,首先建立內部資料庫,然後將外部資料庫複製到內建,外接資料庫檔案在assets裡面。內建的在/data/data/com.包名/databases/資料庫名

首先寫一個SQL類,用來建立程式內建資料庫,這個資料庫結構和外部要一致!初始化是空的。

mySql類:用來初始化內建類,程式執行第一次會初始化一個數據庫

class mySql(context: Context,name:String,version:Int ):SQLiteOpenHelper(context,name,null,version) {

    val Create_ = "Create table sj(id integer primary key autoincrement,name varchar);"
//SQL語句與平時用的SQL一致,建立試卷表
    val mContext = context
    var sjs = arrayListOf<Map<String, Any>>()//存放資料,試卷表的資料
    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        //這是以後用來升級資料庫用的,暫時不用
    }

    override fun onCreate(db: SQLiteDatabase?) {
        //繼承的是help資料庫類,這個方法會在新建物件時候呼叫。
        try {
            db!!.execSQL(Create_)
            //強制執行SQL
            Log.d("dbInit","")
            //這個方法,會檢測資料庫是否存在,存在將不會再重新建立!
            Toast.makeText(mContext, "初始化資料庫", Toast.LENGTH_SHORT).show()
        } catch (e: NullPointerException) {
            println(e)
        }
    }

    //這裡是查詢
    fun wen_query( db: SQLiteDatabase, hand: Handler): Boolean {
       xxx
        return false
    }
}

在main活動裡:初始化這個資料庫物件(不用擔心以後會被覆蓋)

 val temSql = mySql([email protected],"glx",1)//初始化資料庫
//引數:context,資料庫名,版本(隨意)

然後,我們就要把外接的資料庫複製過來了。

看看ImportDB類,用來複制我們外面的資料庫檔案:這裡一定注意,會有很多問題出現。

class ImportDB internal constructor(private val context: Context) {
    private val BUFFER_SIZE =10000
    //一會下面會按照位元組讀取
    //伴生物件,在主活動裡,檢測是否存在資料庫檔案會用到
    companion object {
        val DB_NAME = "glx" //儲存的資料庫檔名
        val PACKAGE_NAME = "com.simplewen.win0"//工程包名
        val DB_PATH = ("/data${Environment.getDataDirectory().absolutePath}/$PACKAGE_NAME/databases")  //在手機裡存放資料庫的位置
    }
    fun copyDatabase():Boolean{
        val dbfile = "$DB_PATH/$DB_NAME"
        Log.d("look",dbfile)
        try {


            //執行資料庫匯入
            val db = this.context.resources.assets.open("glx") //欲匯入的資料庫
            val fos = FileOutputStream(dbfile)
            val buffer = ByteArray(BUFFER_SIZE)
            var count = 0
            //這裡很多小夥伴一定看到過java版的,AS一鍵轉kt,會出現一個問題!,
            //就是:count=db.read出現在了while裡面,這會報紅,kt不支援在while語句出現賦值語句,要用匿名函式。
            while ({ count = db.read(buffer);count}() > 0) {
                        fos.write(buffer, 0, count)
            }
            fos.close()//關閉輸出流
            db.close()//關閉輸入流
            return true
        }catch (e: Throwable) {
            Log.d("look",e.toString())
            e.printStackTrace()
            return false
        }

    }


}

我們看看主活動:這裡思路,當資料庫初始化以後,我們開始匯入外部資料庫,如果匯入完成,設定flag為1,下次啟動檢測,防止重複匯入。

   val file = File(ImportDB.DB_PATH + "/glx")//呼叫伴生物件
        Log.d("here",ImportDB.DB_PATH)
        val share = getSharedPreferences("dbFlag", Activity.MODE_PRIVATE)

        if (file.exists()){
            //內部資料庫存在,開始匯入外部
            Toast.makeText(
[email protected]
, "存在內部資料庫", Toast.LENGTH_SHORT).show() if(share.getString("dbFlag","0") == "1"){ Toast.makeText([email protected], "已經匯入過資料庫", Toast.LENGTH_SHORT).show() }else{ val inDb = ImportDB([email protected]) if(inDb.copyDatabase()){ Toast.makeText([email protected], "複製完成", Toast.LENGTH_SHORT).show() val shareP = getSharedPreferences("dbFlag", Activity.MODE_PRIVATE) val edit = shareP.edit() edit.putString("dbFlag","1")//匯入完成,設定標誌 edit.apply() }else{ Toast.makeText([email protected], "複製失敗", Toast.LENGTH_SHORT).show() } } }

最後,看看具體使用:在另一個FG裡面使用:這個時候,由於資料庫已經存在,再初始化一個物件,將會預設使用新的資料庫。

呼叫,db.query(xxx)...

  val temSql = mySql(activity,"glx",1)
      
    xxx
   val db = temSql.writableDatabase

好了,這個問題,困擾兩天了,網上太多java的資料了,kt很少,這裡和kt小夥伴分享一下,小總結。

相關推薦

Kotlin開發匯入外部資料庫

涉及到內部資料庫的建立使用。 外部資料庫的匯入。 kotlin的檔案讀寫。 最近在寫一個學習資料類的應用。 現在寫到題庫部分。 思路是:事先準備好外部的資料庫(就是題庫了),然後,程式第一次執行時候,首先建立內部資料庫,然後將外部資料庫複製到內建,外接資料庫檔案在as

Kotlin開發ViewPage的動態重新整理

總是遇到一個問題: 無法動態重新整理ViewPage裡的Fragment ViewPage裡使用的是Fragment,list_fg就是一個fg集合、 list_fg.removeAt(msg.arg1) Log.d("msg:",msg.arg1.toString())

kotlin開發fragment向activity傳遞資料通過handler,設定回撥方法

從activity向fragment傳遞就比較方便了,直接用: fg.arguments = arguments 現在看看怎麼從fragment向activity傳遞資料。 比如說,我們在一個ViewPage裡面設定了若干個fragment,fragment裡面有一個按鈕,提交相關

kotlin開發layout檔案分類

我在layout裡面直接建立了很多二級資料夾,甚至還有三級資料夾。 不可以直接使用,因為R索引獲取不到,我們要到構建檔案裡面,加點東西。 是app的構建:加一個SourceSets配置    一定注意:最下面是main/res   res/layout  上面的

開發sd卡操作

use AS con AI string extern toast path 沒有 1.向sdcard中寫入數據: 發現向/mnt/sdcard路徑寫數據會報錯,原因:沒有開啟相應權限 解決:配置文件中加入 <uses-permission android:

開發SmartImageView簡單實現和應用

overload override ans geb actor dsta pub pac 獲取 通常從服務器端獲取的圖片是URL地址,如果簡單地通過URL地址獲取圖片? 有一個開源項目:SmartImageView,做到了這個功能,同時還有其他功能,下載不便,過於龐大 這裏

開發四種對話框

sleep cal bool mas dism extends you port info 先展示一下四種對話框的效果圖: 普通對話框 單選對話框: 多選對話框: 進度條對話框: 一個簡單的布局,放四個按鈕: <LinearLayou

開發RecyclerView的使用(三)

其實我以前也有一個每天聊到深夜的人。   檢視文章: 安卓開發:RecyclerView的使用(一) 安卓開發:RecyclerView的使用(二) 安卓開發:RecyclerView的使用(三) RecyclerView的點選事件

開發RecyclerView的使用(二)

如果你越來越冷漠,你以為你成長了,但其實沒有。長大應該是變得溫柔,對全世界都溫柔。 檢視文章: 安卓開發:RecyclerView的使用(一) 安卓開發:RecyclerView的使用(二) 安卓開發:RecyclerView的使用(三) Re

開發RecyclerView的使用(一)

“走路要牽著我呀 小時候老師沒有跟你說過貴重物品要隨身攜帶嗎” 檢視文章: 安卓開發:RecyclerView的使用(一) 安卓開發:RecyclerView的使用(二) 安卓開發:RecyclerView的使用(三) RecyclerView

開發修改app的文字樣式

我所理解最深沉的愛莫過於我活成了你的樣子                    &nbs

開發資料網址大全

1.官方: 學會主動去獲取知識的能力,提供幾個常備的知識獲取站點吧,平時閒著沒事可以自己上去獲取知識: Android官網: https://developer.android.google.cn/index.html (不需要梯子) Android官網

開發SliddingMenu的使用和配置

時間:2018.10.21 Adroid Studio(AS,我的是最新版2.3.1)中匯入 1.在原來的專案中加入SlidingMenu-master中的library(我把這個資料夾重新命名為SliddingMenu_library) 第一種方法:使用file-

開發應用上架主流平臺彙總

       今天來分享一下安卓的上架平臺,說起來安卓我覺得是比iOS麻煩的,畢竟安卓需要適配各個手機的型號,包括尺寸之類的,而且安卓的上架平臺也比較多,但是主流的也就20個平臺左右吧。        安卓各應用市場的入口整理。安卓的應用市場五花八門,數量非常多,主流的市場

開發初識Android Studio

配置:Android Studio3.2.0,gradle-4.6 ,windows10   在http://www.android-studio.org/完成下載工作,我下載的版本是3.2.0。之後一路安裝,最後沒有SDK的需要安裝一系列東西,準備開始建立第一個專案: applicati

開發配置apache伺服器

  一、安裝 由於安卓開發是手機端的應用,手機端無法搭載MySQL資料庫(但是可以儲存SQLite檔案),我們需要安裝伺服器,將資料庫放在上面,通過網路進行資料互動。 進入官網http://www.apache.org/,滑至最下方,排名第一的HTTP Server就是我們需要的。 當前

開發viewpager + fragment 實現滑動切換

時間緊迫 長話短說 以後再補上 佈局檔案、 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.co

開發數字文字選擇器

一般要固定輸入一定範圍內的數字或文字時用兩種方法比較合適,一種是下拉窗 還有一種是滾動選擇器。 (這是我寫的,還要一種是用手一劃就換數字的) 這裡我們做一個上面的滾動板,不用到github去下載元件,簡單到只有三個按鈕和兩個方法 首先我們線上性佈局中放置三個按鈕(為什麼是

開發跳轉至相簿並返回該圖片資源

在安卓的實際開發中經常使用的需要從應用介面跳轉至相簿(相簿)去獲取圖片資源,並將其應用於專案中,其實在安卓的原生系統中已經為我們提供好了介面,我們只需要通過URI跳轉即可。通過以下三步: 第一步:由於使用的是startActivityForResult跳轉的,

開發仿微博自定義帶進度條和vip標識功能的圓形頭像IdentityImageView

*本篇文章已授權微信公眾號 guolin_blog(郭霖)獨家釋出 最近產品增加了兩個小功能,一個是頭像加一個進度條,用於升級提示,一個是身份標識功能,也就是標識Vip的功能,如圖: , 很多朋友看見這個小功能,肯定覺得特簡單,就是兩張