最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android?Studio中使用SQLite的操作方法

 更新時(shí)間:2023年06月21日 08:29:10   作者:焚詩(shī)作薪  
這篇文章主要介紹了Android?Studio中使用SQLite的操作方法的相關(guān)資料,需要的朋友可以參考下

sqlite簡(jiǎn)介

本人最近在寫一個(gè)小的安卓項(xiàng)目,開發(fā)app過(guò)程中用到了安卓自帶的sqlite。本文主要對(duì)sqlite圖片操作進(jìn)行介紹,其他存入文本之類的操作和普通數(shù)據(jù)庫(kù)一樣,眾所周知,sqlite是一款輕型的數(shù)據(jù)庫(kù),以下先簡(jiǎn)單介紹一下sqlite,為后續(xù)做鋪墊,有了解的大佬可以跳過(guò)此部分:

SQLite是一種輕量級(jí)、嵌入式的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它以庫(kù)的形式提供了一組編程接口,可以在各種操作系統(tǒng)上運(yùn)行,如Windows、Linux、Mac OS等,被廣泛應(yīng)用于移動(dòng)設(shè)備和嵌入式系統(tǒng)中。SQLite的數(shù)據(jù)存儲(chǔ)在單個(gè)文件中,不需要專門的服務(wù)器進(jìn)程或后臺(tái)進(jìn)程,它支持絕大多數(shù)的SQL語(yǔ)法,可以處理大部分中小型應(yīng)用程序的數(shù)據(jù)存儲(chǔ)和管理需要。

SQLite的優(yōu)點(diǎn)主要有以下幾個(gè):

簡(jiǎn)單易用:SQLite非常易于安裝和使用,只需要引入單個(gè)庫(kù)文件,便可以開始使用它提供的API進(jìn)行開發(fā)。

小巧靈活:由于SQLite的設(shè)計(jì)目標(biāo)定位為輕量級(jí)的數(shù)據(jù)庫(kù)管理系統(tǒng),因此它的庫(kù)文件非常小巧,適合在嵌入式設(shè)備和移動(dòng)終端中使用。

零配置:SQLite不需要任何專門的配置或安裝過(guò)程,用戶只需要將其API引入到程序中即可使用,大大簡(jiǎn)化了部署和維護(hù)的工作。

兼容性強(qiáng):SQLite支持大部分標(biāo)準(zhǔn)的SQL語(yǔ)法,同時(shí)可以通過(guò)插件或擴(kuò)展使用自定義的函數(shù)和AGGREGATE聚合函數(shù)。

SQLite的缺點(diǎn)也是比較明顯的:

不適合大規(guī)模數(shù)據(jù)存儲(chǔ):由于SQLite的數(shù)據(jù)存儲(chǔ)在單個(gè)文件中,因此不適合處理大規(guī)模數(shù)據(jù)存儲(chǔ)的需求,處理大量數(shù)據(jù)的查詢和更新操作性能可能較差。

難以擴(kuò)展:SQLite的特性和限制都固定在庫(kù)文件中,因此很難對(duì)其進(jìn)行重構(gòu)或擴(kuò)展,無(wú)法滿足高度定制化需求。

總的來(lái)說(shuō),SQLite是一種非常輕量級(jí)的數(shù)據(jù)庫(kù)管理系統(tǒng),在小型應(yīng)用開發(fā)及移動(dòng)端開發(fā)中十分適合,但在處理大規(guī)模數(shù)據(jù)存儲(chǔ)及高并發(fā)操作的應(yīng)用場(chǎng)景下效果不佳。

插入圖片

進(jìn)入正題,在使用sqlite的過(guò)程中,我遇到了插入圖片失敗的問(wèn)題,查了不少資料,才知道sqlite不能直接存入.jpg還有.png之類的文件,需要以二進(jìn)制的形式存儲(chǔ)在sqlite中,這也是為什么上面說(shuō)的sqlite不適合大規(guī)模數(shù)據(jù)存儲(chǔ),是一個(gè)輕量級(jí)數(shù)據(jù)庫(kù)。我用下面代碼來(lái)進(jìn)一步說(shuō)明

要用到的方法以及部分名詞說(shuō)明:

Bitmap是Android系統(tǒng)中的圖像處理的最重要類之一。用它可以獲取圖像文件信息,進(jìn)行圖像剪切、旋轉(zhuǎn)、縮放等操作,并可以指定格式保存圖像文件。

BitmapFactory.decodeResource(?,?)這個(gè)帶兩個(gè)參數(shù)的方法:第一個(gè)參數(shù)是包含你要加載的位圖資源文件的對(duì)象(一般寫成 getResources()就ok了);第二個(gè)時(shí)你需要加載的位圖資源的Id。

位圖介紹:位圖(Bitmap)格式其實(shí)并不能說(shuō)是一種很常見的格式(從我們?nèi)粘5氖褂妙l率上來(lái)講,遠(yuǎn)不如 .jpg .png .gif 等),因?yàn)槠鋽?shù)據(jù)沒(méi)有經(jīng)過(guò)壓縮,或最多只采用行程長(zhǎng)度編碼(RLE,run-length encoding)來(lái)進(jìn)行輕度的無(wú)損數(shù)據(jù)壓縮

這是一個(gè)寫好的調(diào)用語(yǔ)句和方法,insertdb()是寫好的方法,可以稍加修改后放入你的Activity頁(yè)面或fragment頁(yè)面,調(diào)用語(yǔ)句如圖

//你的圖片在andriod studio中是存在R.drawble中的,并且是int型的
//存入數(shù)據(jù)庫(kù)的id是自己定義數(shù)據(jù)庫(kù)時(shí)設(shè)計(jì)好的,可以參考我的數(shù)據(jù)庫(kù)代碼
 
insertdb( R.drawable.你的圖片名,存入數(shù)據(jù)庫(kù)的id);
 
//s指你的圖片資源,int型,即R.drawable.你的圖片名
private void insertdb(int s,int id){
 
        //把你的圖片資源轉(zhuǎn)化成位圖
        Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), s);
 
        //Mysql是自己寫的數(shù)據(jù)庫(kù)類,需要自己編寫,下面兩句話是實(shí)例化一個(gè)sqlite數(shù)據(jù)庫(kù)對(duì)象
        Mysql mySqlLite = new Mysql(this);
        SQLiteDatabase database = mySqlLite.getReadableDatabase();
        
        //設(shè)置一個(gè)size大小,用來(lái)壓縮圖片文件
        int size = bitmap.getWidth() * bitmap.getHeight() * 4;
 
        //ByteArrayOutputStream(字節(jié)數(shù)組輸出流)對(duì)byte類型數(shù)據(jù)進(jìn)行寫入的類,屬于內(nèi)存操作流
        ByteArrayOutputStream baos= new ByteArrayOutputStream(size);
 
        //壓縮位圖bitmap
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
 
        //定義一個(gè)byte類型的數(shù)組bytedata存儲(chǔ)位圖字節(jié)流轉(zhuǎn)化成的byte數(shù)組
        byte[] bytedata = baos.toByteArray();
 
        //sql語(yǔ)句是根據(jù)自己需求寫的,不要照抄
        database.execSQL("update 你的表名 set image=? where _id=?",new Object[] {bytedata,id});
    }

//MySQL.java
package 你的包名;
 
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
 
 
public class Mysql extends SQLiteOpenHelper {
 
    private static final String DB_NAME="INFORM.db";
    private static final int DB_VERSION=1;
 
    public Mysql(Context context){
        super(context,DB_NAME,null,DB_VERSION);
    }
 
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(
                "CREATE TABLE INFORMATION(" +
                        "_id INTEGER PRIMARY KEY AUTOINCREMENT,"
                        +"NAME TEXT,"
                        +"TITLE TEXT,"
                        +"image blob,"
                        +"TEXTS TEXT);"
        );
 
    
        insertTest(db, "程序員", "程序員.exe無(wú)響應(yīng)","祝你有美好的一天");
        insertTest(db, "程序員", "已停止運(yùn)行","下輩子再也不用sqlite了");
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
    }
 
    public void insertTest(SQLiteDatabase db,String name,String title,String texts){
        ContentValues value=new ContentValues();
        value.put("NAME",name);
        value.put("TITLE",title);
        value.put("TEXTS",texts);
        db.insert("INFORMTION",null,value);
    }
}

讀取圖片

已經(jīng)往數(shù)據(jù)庫(kù)插入圖片了,現(xiàn)在可以讀取圖片了,這里我用的是游標(biāo)

package 你的包名;
 
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import com.example.garden.database.Mydb;
 
public class SearchResult extends AppCompatActivity implements AdapterView.OnItemClickListener {
 
    //定義游標(biāo)
    private Cursor cursor;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search_result);
 
        Intent rit = getIntent();
        String text = rit.getStringExtra("key");
 
        ListView listview=findViewById(R.id.listview);
 
        //幫助器和管理器兩個(gè)老朋友了,實(shí)例化數(shù)據(jù)庫(kù)對(duì)象
        SQLiteOpenHelper helper=new Mydb(this);
        SQLiteDatabase db=helper.getWritableDatabase();
 
        //游標(biāo)讀取數(shù)據(jù)庫(kù)
        cursor=db.rawQuery("select * from KNOW where name like '%"+text+"%'",null);
        cursor.moveToFirst();
 
        //數(shù)據(jù)庫(kù)的簡(jiǎn)單游標(biāo)適配器,簡(jiǎn)單來(lái)說(shuō)就是往模板填充內(nèi)容的一個(gè)橋梁
        SimpleCursorAdapter mAdapter=new SimpleCursorAdapter(this,R.layout.item_list,
                cursor,new String[]{"NAME","image","TITLE"},new int[]{R.id.iv1,R.id.iv2,R.id.iv3},0);//自己的xml組件名R.id.iv1,R.id.iv2,R.id.iv3與數(shù)據(jù)庫(kù)字段名"NAME","image","TITLE"對(duì)應(yīng),更多用法自己查
 
        //僅僅是上面的簡(jiǎn)單游標(biāo)適配器是不能讀取圖片的,重點(diǎn)來(lái)了,此處用到了ViewBinder
        SimpleCursorAdapter.ViewBinder binder=new SimpleCursorAdapter.ViewBinder() {
            @Override
            public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
 
        //判斷是否是ImageView,這個(gè)判斷非常關(guān)鍵,詳細(xì)可以按ctr去查找ViewBinder,就去文檔看,不要找其他資料,如果想真的搞懂一定要看!
                if (view instanceof ImageView) {
                    ImageView imageView = (ImageView) view;
 
           imageView.setImageBitmap(readImageFromDb(cursor.getString(cursor.getColumnIndex("_id"))));//為imageView配置id所對(duì)應(yīng)的圖片   
                    return true;
                }
                return false;
            }
        };
 
        //配置ViewBinder
        mAdapter.setViewBinder(binder);
        //配置適配器
        listview.setAdapter(mAdapter);
        //點(diǎn)擊監(jiān)聽器
        listview.setOnItemClickListener(this);
 
   }
 
    //
    @SuppressLint("Range")
    private Bitmap readImage(String id) {
 
    //至于為什么又要實(shí)例化,是因?yàn)閟qlite不能同時(shí)使用,術(shù)語(yǔ)不專業(yè),總之要重新實(shí)例化,不然會(huì)報(bào)錯(cuò)
        Mysql mySqlLite2 = new Mysql(this);
        SQLiteDatabase database2 = mySqlLite2.getReadableDatabase();
 
        Bitmap image= null;
        byte[] bytes;
        Cursor cursor = database2.rawQuery( "SELECT * FROM INFORMATION WHERE _id = ?", new String[]{id});
        if (cursor.moveToFirst()) {
            if ((bytes = cursor.getBlob(cursor.getColumnIndex("image"))) != null) {
                image= BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
            }
        }
        cursor.close();
        return image;
    }
 
 
    //listview的點(diǎn)擊事件
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //此處寫點(diǎn)擊事件,我用來(lái)傳值以及跳轉(zhuǎn)頁(yè)面
        Intent it=new Intent(this, Show.class);
        it.putExtra("ID",(int)id-1);
        startActivity(it);
        finish();
    }
}

可能會(huì)出現(xiàn)的問(wèn)題

此處重點(diǎn)!我遇到的大問(wèn)題目前只有一個(gè),就是行過(guò)大導(dǎo)致無(wú)法讀取數(shù)據(jù)庫(kù),原因是我放入的圖片太大了,大概1MB左右的樣子,我其他的圖片大小一般是200KB到500KB左右,1MB的圖片太大了,導(dǎo)致那個(gè)位圖轉(zhuǎn)化的二進(jìn)制數(shù)據(jù)流太大了,數(shù)據(jù)庫(kù)無(wú)法一次讀取完,會(huì)導(dǎo)致程序直接崩潰,解決辦法就是不存入太大的圖片。畢竟它還只是個(gè)”孩砸“啊,sqlite是個(gè)輕量級(jí)的數(shù)據(jù)庫(kù),不要存入太大的圖片

總結(jié)

寫代碼的過(guò)程中遇到了不少問(wèn)題,感謝互聯(lián)網(wǎng)各位大佬發(fā)的參考資料,由于參考了許多資料和文獻(xiàn),也因?yàn)楫?dāng)時(shí)寫的太快了沒(méi)有記住大佬的博客和文章,深表歉意,本項(xiàng)目后續(xù)完善后也會(huì)發(fā)到GitHub上面去,做一個(gè)開源小項(xiàng)目給大家參考,本人目前大二計(jì)科學(xué)生,希望和各位一同成長(zhǎng)前進(jìn)。

到此這篇關(guān)于Android Studio中使用SQLite的操作方法的文章就介紹到這了,更多相關(guān)Android Studio中使用SQLite內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Kotlin如何捕獲上下文中的變量與常量詳解

    Kotlin如何捕獲上下文中的變量與常量詳解

    這篇文章主要給大家介紹了關(guān)于Kotlin如何捕獲上下文中的變量與常量的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Kotlin具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Android 中Fragment與Activity通訊的詳解

    Android 中Fragment與Activity通訊的詳解

    這篇文章主要介紹了Android 中Fragment與Activity通訊的詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握如何通信的,需要的朋友可以參考下
    2017-10-10
  • 在android開發(fā)中盡量不要使用中文路徑的問(wèn)題詳解

    在android開發(fā)中盡量不要使用中文路徑的問(wèn)題詳解

    本篇文章對(duì)在android開發(fā)中盡量不要使用中文路徑的問(wèn)題進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • 深入淺出RxJava+Retrofit+OkHttp網(wǎng)絡(luò)請(qǐng)求

    深入淺出RxJava+Retrofit+OkHttp網(wǎng)絡(luò)請(qǐng)求

    本篇文章主要介紹了深入淺出RxJava+Retrofit+OkHttp網(wǎng)絡(luò)請(qǐng)求,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Android ImageButton 使用方法示例詳解

    Android ImageButton 使用方法示例詳解

    ImageButton 是 Android 中專門用于顯示圖片按鈕的控件,它繼承自 ImageView,但具有按鈕的點(diǎn)擊特性,下面我將全面介紹 ImageButton 的使用方法,感興趣的朋友一起看看吧
    2025-04-04
  • 使用newInstance()來(lái)實(shí)例化fragment并傳遞數(shù)據(jù)操作

    使用newInstance()來(lái)實(shí)例化fragment并傳遞數(shù)據(jù)操作

    這篇文章主要介紹了使用newInstance()來(lái)實(shí)例化fragment并傳遞數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • android中webview定位問(wèn)題示例詳解

    android中webview定位問(wèn)題示例詳解

    這篇文章主要給大家介紹了關(guān)于android中webview定位問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • Android Dialog對(duì)話框用法實(shí)例詳解

    Android Dialog對(duì)話框用法實(shí)例詳解

    這篇文章主要介紹了Android Dialog對(duì)話框用法,結(jié)合實(shí)例形式分析了Android使用Dialog對(duì)話框過(guò)程中所涉及的創(chuàng)建、保存、回復(fù)等操作相關(guān)技巧與注意事項(xiàng),需要的朋友可以參考下
    2016-07-07
  • 詳解Android TabHost的多種實(shí)現(xiàn)方法 附源碼下載

    詳解Android TabHost的多種實(shí)現(xiàn)方法 附源碼下載

    這篇文章主要為大家詳細(xì)介紹了Android TabHost的多種實(shí)現(xiàn)方法 文章中針對(duì)每一種實(shí)現(xiàn)方法都附有源碼進(jìn)行下載,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android MPAndroidChart開源圖表庫(kù)之餅狀圖的代碼

    Android MPAndroidChart開源圖表庫(kù)之餅狀圖的代碼

    MPAndroidChart是一款基于Android的開源圖表庫(kù),MPAndroidChart不僅可以在Android設(shè)備上繪制各種統(tǒng)計(jì)圖表,而且可以對(duì)圖表進(jìn)行拖動(dòng)和縮放操作,應(yīng)用起來(lái)非常靈活
    2018-05-05

最新評(píng)論

泰顺县| 志丹县| 云林县| 抚松县| 河西区| 西畴县| 资溪县| 江源县| 乌鲁木齐县| 桃江县| 康乐县| 尼玛县| 横山县| 汉源县| 红原县| 寿宁县| 新野县| 乐昌市| 平邑县| 信丰县| 抚顺县| 彩票| 淮阳县| 常熟市| 苏尼特左旗| 凤山县| 祥云县| 阳信县| 易门县| 将乐县| 元朗区| 大竹县| 宣汉县| 若尔盖县| 都江堰市| 嘉鱼县| 涟水县| 会理县| 东兴市| 淳安县| 兰溪市|