Android使用外部db正确姿势
2019-05-17 本文已影响0人
Android砖家
在android开发过程中,有时候会自己创建db,也有可能使用外部给的db.
简单说下自己创建db的步骤:
1.写一个类继承SQLiteOpenHelper
2.在onCreate里面实现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) {
//打开数据库,建立了一个叫records的表,里面只有一列name来存储历史记录:
db.execSQL("create table records(id integer primary key autoincrement,name varchar(200))");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
那使用外部创建好的db怎么使用呢? 当然也还是要用到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的时候onCreate方法里面是没有任何操作的
。接下实操怎么实现外部使用db
首先了解下android db 存放在哪里?
答:/data/data/项目包名/databases/
如下图
了解db默认存在的位置之后就好办事了。既然是使用外部db,肯定就需要把外部的db文件,放在android项目某个位置,再通过文件流的读写方式,将db copy一份到/data/data/项目包名/databases/
下。
步骤:
1.讲外部xx.db 放到android项目assets目录中。
yhx.png
2.通过文件流的读写方式写入/data/data/项目包名/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 是程序的包名,请根据自己的程序调整
// /data/data/com.app.yhx.db/databases目录是准备放 SQLite 数据库的地方,也是 Android 程序默认的数据库存储目录
// 数据库名为 tag.db
String DB_PATH = "/data/data/com.app.yhx.db/databases/";
String DB_NAME = "tag.db";
// 检查 SQLite 数据库文件是否存在
if (!(new File(DB_PATH + DB_NAME)).exists()) {
// 如 SQLite 数据库文件不存在,再检查一下 database 目录是否存在
File f = new File(DB_PATH);
// 如 database 目录不存在,新建该目录
if (!f.exists()) {
f.mkdir();
}
try {
// 得到 assets 目录下我们实现准备好的 SQLite 数据库作为输入流
InputStream is = context.getAssets().open(DB_NAME);
// 输出流,在指定路径下生成db文件
OutputStream os = new FileOutputStream(DB_PATH + DB_NAME);
// 文件写入
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
// 关闭文件流
os.flush();
os.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
3.自定义SQLiteOpenHelper类。(记住这是外部数据库,所以不要在onCreate()做任何操作,上面已经说明了)
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) {
//空实现,不要做操作
}
@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;
}
}
结果:
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数据库
DatabaseUtil.packDataBase(this);
//第二步:查询数据库
DbDao dbDao = new DbDao(this);
if (dbDao.queryData().size() > 0) {
mTextview.setText(dbDao.queryData().get(0));
}
}
}
查询之后的结果,没毛病
yhx.png到此:简单的使用外部db就美滋滋完成了。