Android?Studio中使用SQLite的操作方法
sqlite簡介
本人最近在寫一個(gè)小的安卓項(xiàng)目,開發(fā)app過程中用到了安卓自帶的sqlite。本文主要對(duì)sqlite圖片操作進(jìn)行介紹,其他存入文本之類的操作和普通數(shù)據(jù)庫一樣,眾所周知,sqlite是一款輕型的數(shù)據(jù)庫,以下先簡單介紹一下sqlite,為后續(xù)做鋪墊,有了解的大佬可以跳過此部分:
SQLite是一種輕量級(jí)、嵌入式的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它以庫的形式提供了一組編程接口,可以在各種操作系統(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īng)用程序的數(shù)據(jù)存儲(chǔ)和管理需要。
SQLite的優(yōu)點(diǎn)主要有以下幾個(gè):
簡單易用:SQLite非常易于安裝和使用,只需要引入單個(gè)庫文件,便可以開始使用它提供的API進(jìn)行開發(fā)。
小巧靈活:由于SQLite的設(shè)計(jì)目標(biāo)定位為輕量級(jí)的數(shù)據(jù)庫管理系統(tǒng),因此它的庫文件非常小巧,適合在嵌入式設(shè)備和移動(dòng)終端中使用。
零配置:SQLite不需要任何專門的配置或安裝過程,用戶只需要將其API引入到程序中即可使用,大大簡化了部署和維護(hù)的工作。
兼容性強(qiáng):SQLite支持大部分標(biāo)準(zhǔn)的SQL語法,同時(shí)可以通過插件或擴(kuò)展使用自定義的函數(shù)和AGGREGATE聚合函數(shù)。
SQLite的缺點(diǎn)也是比較明顯的:
不適合大規(guī)模數(shù)據(jù)存儲(chǔ):由于SQLite的數(shù)據(jù)存儲(chǔ)在單個(gè)文件中,因此不適合處理大規(guī)模數(shù)據(jù)存儲(chǔ)的需求,處理大量數(shù)據(jù)的查詢和更新操作性能可能較差。
難以擴(kuò)展:SQLite的特性和限制都固定在庫文件中,因此很難對(duì)其進(jìn)行重構(gòu)或擴(kuò)展,無法滿足高度定制化需求。
總的來說,SQLite是一種非常輕量級(jí)的數(shù)據(jù)庫管理系統(tǒng),在小型應(yīng)用開發(fā)及移動(dòng)端開發(fā)中十分適合,但在處理大規(guī)模數(shù)據(jù)存儲(chǔ)及高并發(fā)操作的應(yīng)用場景下效果不佳。
插入圖片
進(jìn)入正題,在使用sqlite的過程中,我遇到了插入圖片失敗的問題,查了不少資料,才知道sqlite不能直接存入.jpg還有.png之類的文件,需要以二進(jìn)制的形式存儲(chǔ)在sqlite中,這也是為什么上面說的sqlite不適合大規(guī)模數(shù)據(jù)存儲(chǔ),是一個(gè)輕量級(jí)數(shù)據(jù)庫。我用下面代碼來進(jìn)一步說明
要用到的方法以及部分名詞說明:
Bitmap是Android系統(tǒng)中的圖像處理的最重要類之一。用它可以獲取圖像文件信息,進(jìn)行圖像剪切、旋轉(zhuǎn)、縮放等操作,并可以指定格式保存圖像文件。
BitmapFactory.decodeResource(?,?)這個(gè)帶兩個(gè)參數(shù)的方法:第一個(gè)參數(shù)是包含你要加載的位圖資源文件的對(duì)象(一般寫成 getResources()就ok了);第二個(gè)時(shí)你需要加載的位圖資源的Id。
位圖介紹:位圖(Bitmap)格式其實(shí)并不能說是一種很常見的格式(從我們?nèi)粘5氖褂妙l率上來講,遠(yuǎn)不如 .jpg .png .gif 等),因?yàn)槠鋽?shù)據(jù)沒有經(jīng)過壓縮,或最多只采用行程長度編碼(RLE,run-length encoding)來進(jìn)行輕度的無損數(shù)據(jù)壓縮
這是一個(gè)寫好的調(diào)用語句和方法,insertdb()是寫好的方法,可以稍加修改后放入你的Activity頁面或fragment頁面,調(diào)用語句如圖
//你的圖片在andriod studio中是存在R.drawble中的,并且是int型的
//存入數(shù)據(jù)庫的id是自己定義數(shù)據(jù)庫時(shí)設(shè)計(jì)好的,可以參考我的數(shù)據(jù)庫代碼
insertdb( R.drawable.你的圖片名,存入數(shù)據(jù)庫的id);
//s指你的圖片資源,int型,即R.drawable.你的圖片名
private void insertdb(int s,int id){
//把你的圖片資源轉(zhuǎn)化成位圖
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), s);
//Mysql是自己寫的數(shù)據(jù)庫類,需要自己編寫,下面兩句話是實(shí)例化一個(gè)sqlite數(shù)據(jù)庫對(duì)象
Mysql mySqlLite = new Mysql(this);
SQLiteDatabase database = mySqlLite.getReadableDatabase();
//設(shè)置一個(gè)size大小,用來壓縮圖片文件
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語句是根據(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無響應(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ù)庫插入圖片了,現(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ù)庫對(duì)象
SQLiteOpenHelper helper=new Mydb(this);
SQLiteDatabase db=helper.getWritableDatabase();
//游標(biāo)讀取數(shù)據(jù)庫
cursor=db.rawQuery("select * from KNOW where name like '%"+text+"%'",null);
cursor.moveToFirst();
//數(shù)據(jù)庫的簡單游標(biāo)適配器,簡單來說就是往模板填充內(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ù)庫字段名"NAME","image","TITLE"對(duì)應(yīng),更多用法自己查
//僅僅是上面的簡單游標(biāo)適配器是不能讀取圖片的,重點(diǎn)來了,此處用到了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è),總之要重新實(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)擊事件,我用來傳值以及跳轉(zhuǎn)頁面
Intent it=new Intent(this, Show.class);
it.putExtra("ID",(int)id-1);
startActivity(it);
finish();
}
}可能會(huì)出現(xiàn)的問題
此處重點(diǎn)!我遇到的大問題目前只有一個(gè),就是行過大導(dǎo)致無法讀取數(shù)據(jù)庫,原因是我放入的圖片太大了,大概1MB左右的樣子,我其他的圖片大小一般是200KB到500KB左右,1MB的圖片太大了,導(dǎo)致那個(gè)位圖轉(zhuǎn)化的二進(jìn)制數(shù)據(jù)流太大了,數(shù)據(jù)庫無法一次讀取完,會(huì)導(dǎo)致程序直接崩潰,解決辦法就是不存入太大的圖片。畢竟它還只是個(gè)”孩砸“啊,sqlite是個(gè)輕量級(jí)的數(shù)據(jù)庫,不要存入太大的圖片
總結(jié)
寫代碼的過程中遇到了不少問題,感謝互聯(lián)網(wǎng)各位大佬發(fā)的參考資料,由于參考了許多資料和文獻(xiàn),也因?yàn)楫?dāng)時(shí)寫的太快了沒有記住大佬的博客和文章,深表歉意,本項(xiàng)目后續(xù)完善后也會(huì)發(fā)到GitHub上面去,做一個(gè)開源小項(xiàng)目給大家參考,本人目前大二計(jì)科學(xué)生,希望和各位一同成長前進(jìn)。
到此這篇關(guān)于Android Studio中使用SQLite的操作方法的文章就介紹到這了,更多相關(guān)Android Studio中使用SQLite內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android SQLite數(shù)據(jù)庫增刪改查操作的使用詳解
- Android開發(fā)之SQLite的使用方法
- Android使用SQLite數(shù)據(jù)庫的簡單實(shí)例
- android創(chuàng)建數(shù)據(jù)庫(SQLite)保存圖片示例
- Android SQLite數(shù)據(jù)庫基本操作方法
- Android登錄注冊功能 數(shù)據(jù)庫SQLite驗(yàn)證
- android中sqlite的按條件查找的小例子
- Android Studio連接SQLite數(shù)據(jù)庫的登錄注冊實(shí)現(xiàn)
- 深入Android SQLite 事務(wù)處理詳解
- Android--SQLite(增,刪,改,查)操作實(shí)例代碼
相關(guān)文章
android開發(fā)教程之時(shí)間對(duì)話框核心代碼
這篇文章主要介紹了android的時(shí)間對(duì)話框核心代碼,需要的朋友可以參考下2014-04-04
教你快速實(shí)現(xiàn)Android動(dòng)態(tài)模糊效果
相信大家都發(fā)現(xiàn)了越來越多的App里面使用了模糊效果,比如雅虎天氣的界面,雖然我并不知道雅虎天氣是怎么做出這種效果的,但是簡單的模仿一下的話,還是能做到的。下面一起來學(xué)習(xí)學(xué)習(xí)。2016-08-08
Android平臺(tái)生成二維碼并實(shí)現(xiàn)掃描 & 識(shí)別功能
這篇文章主要介紹了Android平臺(tái)生成二維碼并實(shí)現(xiàn)掃描 & 識(shí)別功能的相關(guān)資料,需要的朋友可以參考下2016-06-06
Android編程實(shí)現(xiàn)的自定義彈窗(PopupWindow)功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)的自定義彈窗(PopupWindow)功能,結(jié)合簡單實(shí)例形式分析了Android自定義彈窗實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-03-03
Android 實(shí)現(xiàn)獲取手機(jī)里面的所有圖片詳解及實(shí)例
這篇文章主要介紹了Android 實(shí)現(xiàn)獲取手機(jī)里面的所有圖片詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
Android WindowManger的層級(jí)分析詳解
這篇文章主要介紹了Android WindowManger的層級(jí)分析詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
Flutter事件監(jiān)聽與EventBus事件的應(yīng)用詳解
EventBus的核心是基于Streams。它允許偵聽器訂閱事件并允許發(fā)布者觸發(fā)事件,使得不同組件的數(shù)據(jù)不需要一層層傳遞,可以直接通過EventBus實(shí)現(xiàn)跨組件通訊2023-04-04
Android開發(fā)使用strings.xml多語言翻譯解決方案
這篇文章主要為大家介紹了Android開發(fā)使用strings.xml多語言翻譯解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Android實(shí)現(xiàn)跳轉(zhuǎn)第三方百度地圖導(dǎo)航
在眾多地圖導(dǎo)航產(chǎn)品中,百度地圖以其精準(zhǔn)的導(dǎo)航和豐富的本地生活數(shù)據(jù)受到廣泛歡迎,本項(xiàng)目介紹如何在 Android 中構(gòu)造 Intent 調(diào)用百度地圖導(dǎo)航,希望對(duì)大家有所幫助2025-04-04
Android webview與js交換JSON對(duì)象數(shù)據(jù)示例
js主動(dòng)調(diào)用android的對(duì)象方式,android也無法返回給js一個(gè)jsonobject,需要js做一下轉(zhuǎn)換,具體代碼如下,感興趣的朋友可以參考下哈2013-06-06

