Android 中 导入已存在的 sqlite数据库时出现的问题

时间:2021-02-23 20:48:49

1》刚开始时我导入sqlite数据库放在了asserts下面,我按照网上的例子最后发现是我的“包名”出了问题,我现在用Android studio 以前用的时eclipse  ,所以习惯性的我就应用了mainfaset下面的包名了,所以不管我怎么读取sqlite文件总是打不开数据库。。。。。。。包名要到grid里面去拿,下面是创建数据库的代码。。

package com.yzkj.utils.twicedb;

import android.content.Context;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
* Created by Administrator on 2016/12/7.
*/

public class DataBaseHelper {

//数据库存储路径
String filePath = "data/data/yzkj.com.android_zdzy/herbsinfo.db";
//数据库存放的文件夹 data/data/com.main.jh 下面
String pathStr = "data/data/yzkj.com.android_zdzy";

SQLiteDatabase database;

public SQLiteDatabase openDatabase(Context context) {
System.out.println("filePath:" + filePath);
File jhPath = new File(filePath);
//查看数据库文件是否存在
if (jhPath.exists()) {
Log.i("test", "存在数据库");
//存在则直接返回打开的数据库
return SQLiteDatabase.openOrCreateDatabase(jhPath, null);
} else {
//不存在先创建文件夹
File path = new File(pathStr);
Log.i("test", "pathStr=" + path);
try {
if (!path.exists()){
path.mkdir();
}
}catch (Exception e){
Log.e("test", "创建失败"+e);
}
try {
Log.e("test", "444444444444444444444444");
//得到资源
AssetManager am = context.getAssets();
//得到数据库的输入流
InputStream is = am.open("herbsinfo.db");

Log.e("33333333333333333", is + "");
//用输出流写到SDcard上面
FileOutputStream fos = new FileOutputStream(jhPath);
Log.e("test", "fos=" + fos);
Log.e("test", "jhPath=" + jhPath);
//创建byte数组 用于1KB写一次
byte[] buffer = new byte[1024];
int count = 0;
while ((count = is.read(buffer)) > 0) {
Log.e("test", "得到");
fos.write(buffer, 0, count);
}
//最后关闭就可以了
fos.flush();
fos.close();
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
//如果没有这个数据库 我们已经把他写到SD卡上了,然后在执行一次这个方法 就可以返回数据库了
return openDatabase(context);
}
}

// /**
// * 查询本地草药
// * @param sql
// * @return
// */
public List<Herbs> QueCy(String sql,SQLiteDatabase db) {


List<Herbs> list = new ArrayList<Herbs>();

Cursor cursor = null;
try{
cursor = db.rawQuery(sql,null);
}catch (Exception e){
Log.e("-----------","--------------"+e);
}

if(cursor.getCount()==0)
{
return list;
}

if (cursor != null&& cursor.getCount() >= 1 ) {

cursor.moveToFirst();

while (!cursor.isAfterLast()) {

//id
String herbid = cursor.getString(cursor
.getColumnIndex("herbid"));
//药名
String cyname = cursor.getString(cursor
.getColumnIndex("cyname"));
//丁香--DX:[11--22]
String namereamrk = cursor.getString(cursor
.getColumnIndex("namereamrk"));
//要单位
String dw = cursor.getString(cursor
.getColumnIndex("dw"));
//煎服
String jf = cursor.getString(cursor
.getColumnIndex("jf"));
//药价格
double price = cursor.getDouble(cursor.getColumnIndex("price"));

Herbs herbs = new Herbs();
herbs.setHerbid(herbid);
herbs.setCyname(cyname);
herbs.setNamereamrk(namereamrk);
herbs.setDw(dw);
herbs.setJf(jf);
herbs.setPrice(price);
list.add(herbs);

cursor.moveToNext();
}

cursor.close();
}

return list;

}

}
 
创建完成了最后有遇到问题,,,,,Sqlite Expert personal软件打开的我的db文件,我就按照上面的
字段进行实体化,最后发现这个软件会自动生成一个 rowid的字段,
导致我程序运行出错:Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
最后发现了,把多余的实体字段删掉就没事了。。。。可算是弄好了,弄了将近一天了,哈哈哈哈。。最好到首个启动的activity中初始化复制数据库到本地。