在android開(kāi)發(fā)過(guò)程中艾杏,有時(shí)候會(huì)自己創(chuàng)建db,也有可能使用外部給的db.
簡(jiǎn)單說(shuō)下自己創(chuàng)建db的步驟:
1.寫(xiě)一個(gè)類(lèi)繼承SQLiteOpenHelper
2.在onCreate里面實(shí)現(xiàn)db.execSQL
public class RecordSQLiteOpenHelper extends SQLiteOpenHelper {
private static String name = "game.db";
private static Integer version = 1;
public RecordSQLiteOpenHelper(Context context) {
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
//打開(kāi)數(shù)據(jù)庫(kù)别伏,建立了一個(gè)叫records的表韵洋,里面只有一列name來(lái)存儲(chǔ)歷史記錄:
db.execSQL("create table records(id integer primary key autoincrement,name varchar(200))");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
那使用外部創(chuàng)建好的db怎么使用呢洞拨? 當(dāng)然也還是要用到SQLiteOpenHelper
public class ProvinceDataHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "tag.db";
private static final int DATABASE_VERSION = 1;
/** Create a helper object for the Events database */
public ProvinceDataHelper(Context ctx) {
super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}
這里值得注意的是皿伺,使用外部db的時(shí)候onCreate方法里面是沒(méi)有任何操作的
奈籽。接下實(shí)操怎么實(shí)現(xiàn)外部使用db
首先了解下android db 存放在哪里市咽?
答:/data/data/項(xiàng)目包名/databases/
如下圖
了解db默認(rèn)存在的位置之后就好辦事了垂涯。既然是使用外部db,肯定就需要把外部的db文件汁掠,放在android項(xiàng)目某個(gè)位置集币,再通過(guò)文件流的讀寫(xiě)方式乞榨,將db copy一份到/data/data/項(xiàng)目包名/databases/
下考榨。
步驟:
1.講外部xx.db 放到android項(xiàng)目assets目錄中震叙。
2.通過(guò)文件流的讀寫(xiě)方式寫(xiě)入/data/data/項(xiàng)目包名/databases/
下划址。
package com.app.yhx.db;
import android.annotation.SuppressLint;
import android.content.Context;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
* author : yihuangxing
* date : 2019/5/17 14:28
* desc :
*/
public class DatabaseUtil {
@SuppressLint("SdCardPath")
public static void packDataBase(Context context){
//com.app.yhx.db 是程序的包名世澜,請(qǐng)根據(jù)自己的程序調(diào)整
// /data/data/com.app.yhx.db/databases目錄是準(zhǔn)備放 SQLite 數(shù)據(jù)庫(kù)的地方,也是 Android 程序默認(rèn)的數(shù)據(jù)庫(kù)存儲(chǔ)目錄
// 數(shù)據(jù)庫(kù)名為 tag.db
String DB_PATH = "/data/data/com.app.yhx.db/databases/";
String DB_NAME = "tag.db";
// 檢查 SQLite 數(shù)據(jù)庫(kù)文件是否存在
if (!(new File(DB_PATH + DB_NAME)).exists()) {
// 如 SQLite 數(shù)據(jù)庫(kù)文件不存在,再檢查一下 database 目錄是否存在
File f = new File(DB_PATH);
// 如 database 目錄不存在俭驮,新建該目錄
if (!f.exists()) {
f.mkdir();
}
try {
// 得到 assets 目錄下我們實(shí)現(xiàn)準(zhǔn)備好的 SQLite 數(shù)據(jù)庫(kù)作為輸入流
InputStream is = context.getAssets().open(DB_NAME);
// 輸出流,在指定路徑下生成db文件
OutputStream os = new FileOutputStream(DB_PATH + DB_NAME);
// 文件寫(xiě)入
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
// 關(guān)閉文件流
os.flush();
os.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
3.自定義SQLiteOpenHelper類(lèi)车要。(記住這是外部數(shù)據(jù)庫(kù)崭倘,所以不要在onCreate()做任何操作悉患,上面已經(jīng)說(shuō)明了)
package com.app.yhx.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* author : yihuangxing
* date : 2019/5/17 14:31
* desc :
*/
public class ProvinceDataHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "tag.db";
private static final int DATABASE_VERSION = 1;
/** Create a helper object for the Events database */
public ProvinceDataHelper(Context ctx) {
super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//空實(shí)現(xiàn)售躁,不要做操作
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}
4.基本的增刪改查。
package com.app.yhx.db;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.List;
/**
* author : yihuangxing
* date : 2019/5/17 14:32
* desc :
*/
public class DbDao {
private ProvinceDataHelper helper;
private SQLiteDatabase db = null;
public DbDao(Context mContext) {
helper = new ProvinceDataHelper(mContext);
}
public List<String> queryData(){
List<String> proList = new ArrayList<String>();
try{
db = helper.getReadableDatabase();
//注意表為"WatchingContentHistory"? 怎么知道表名為"WatchingContentHistory"茴晋,答:android 可視化工具
Cursor cursor = db.rawQuery("select * from WatchingContentHistory", null);
if(null != cursor){
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("title"));
proList.add(name);
}
}
cursor.close();
}catch(Exception e){
e.printStackTrace();
}finally{
if(null != db){
db.close();
}
}
return proList;
}
}
結(jié)果:
public class MainActivity extends AppCompatActivity {
private TextView mTextview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextview = findViewById(R.id.Textview);
//第一步:copy數(shù)據(jù)庫(kù)
DatabaseUtil.packDataBase(this);
//第二步:查詢(xún)數(shù)據(jù)庫(kù)
DbDao dbDao = new DbDao(this);
if (dbDao.queryData().size() > 0) {
mTextview.setText(dbDao.queryData().get(0));
}
}
}
查詢(xún)之后的結(jié)果陪捷,沒(méi)毛病
到此:簡(jiǎn)單的使用外部db就美滋滋完成了。