Android的SQLite创建数据库错误
问题描述:
我是新手与android sqlite数据库。现在我只是尝试创建自定义数据库管理器,并且在oncreate()函数中出现错误。我已经花了3天的时间弄清楚了,但不幸的是我仍然陷入了困境。任何辉煌的想法将不胜感激。Android的SQLite创建数据库错误
public class DBManager extends SQLiteOpenHelper {
private SQLiteDatabase db;
private static Context myContext;
public static final String DB_NAME = "goldenland.db";
public static final String TB_CAT = "tbl_categories";
public static final String TB_ARTICLE = "tbl_articles";
public static final String TB_SUBCAT = "tbl_subcategories";
public static final String TB_SCHEDULE = "tbl_schedule";
public static final String TB_CONTENT = "tbl_contents";
public static final String TB_CITY = "tbl_cities";
public static final String name = "name";
public static String DB_PATH = "/data/data/com.gokiri.goldenland/databases/";
public DBManager(Context context) {
super(context, DB_NAME, null, 1);
DBManager.myContext = context;
}
public void createDataBase() throws IOException {
boolean dbExit = checkDataBase();
if (dbExit) {
System.out.println("Testing");
} else {
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
}
}
private boolean checkDataBase() {
SQLiteDatabase checkDb = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDb = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
} catch (SQLException e) {
}
if (checkDb != null) {
checkDb.close();
}
return checkDb != null ? true : false;
}
public void copyDataBase() throws IOException {
InputStream myInput = myContext.getAssets().open("goldenland_2.sqlite");
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
public void openDatabase() throws SQLiteException {
String myPath = DB_PATH + DB_NAME;
db = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
}
答
有几件事情可能是错的。你的数据库真的存在于资源/资产吗?你正在写入正确的目录吗?通过调试器来进行诊断会大大有助于诊断问题。
您可以通过让copyDatabase
采取String
参数(this.getReadableDatabase().getPath()
)来获得理智检查。您甚至可以尝试将其写入日志以查看是否正在写入正确的数据库目录。
答
很少有事情要检查。 1.在方法checkDataBase
中打开OPEN_READONLY
模式的数据库。 2.这是非常重要的检查,数据库的大小小于1 MB。 3.0之前的Android版本不允许超过1 MB的文件副本。
更新: 您需要拆分数据库文件到每个1Mb的部分,复制所有零件逐一重新加入他们在一起。请参阅以下内容link
不应该静态保存上下文。如果您从多个活动中访问此代码,则可能会导致崩溃。 – 2011-03-15 04:02:45
所以我怎么能使用这个代码从多个活动。它是否与手机读/写访问有关? – geekmyo 2011-03-15 04:06:57