Java “没有这样的表”SQLITE数据库
我总是犯这个错误。我的数据库是我自己创建的。我不是用代码创建的,我是说。它是从assets文件夹创建的,如果我从手机上通过Sqlite reader应用程序打开它,它会完美地显示表格和数据。但是,我无法在项目中读取此数据库。它创建数据库,但无法从应用程序中读取。我的连接类是一个.aar文件,我将它添加到gradle中。这是我的助手代码:Java “没有这样的表”SQLITE数据库,java,android,sqlite,gradle,Java,Android,Sqlite,Gradle,我总是犯这个错误。我的数据库是我自己创建的。我不是用代码创建的,我是说。它是从assets文件夹创建的,如果我从手机上通过Sqlite reader应用程序打开它,它会完美地显示表格和数据。但是,我无法在项目中读取此数据库。它创建数据库,但无法从应用程序中读取。我的连接类是一个.aar文件,我将它添加到gradle中。这是我的助手代码: public class Connection extends SQLiteOpenHelper { private static String _dbPath
public class Connection extends SQLiteOpenHelper {
private static String _dbPath;
private static String _dbName;
private final Context _context;
public Connection(Context context, int dbVer, String dbPath, String dbName) {
super(context, dbName, null, dbVer);
this._context = context;
_dbPath = dbPath;
_dbName = dbName;
CreateDatabase();
}
public void CreateDatabase() {
boolean dbExist = CheckDatabase();
if (!dbExist) {
this.getReadableDatabase();
try {
CopyDatabase();
} catch (IOException e) {
throw new Error("Error.");
}
}
}
private boolean CheckDatabase() {
SQLiteDatabase checkDB = null;
try {
String myPath = _dbPath + "/" + _dbName;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
} catch (SQLiteException e) {
if (checkDB != null) {
checkDB.close();
}
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
private void CopyDatabase() throws IOException {
InputStream myInput = _context.getAssets().open(_dbName);
String outFileName = _dbPath + "/" + _dbName;
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();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}}
这是我的密码:
public static Cursor Select(Context context, Select select, ArrayList<Where> whereList) {
String dbPath, dbName;
Integer dbVer;
SQLiteDatabase database;
Cursor cursor;
dbVer = (Integer) TDTools.ReturnResource(context, R.integer.dbVer, TDTools.ResType.Integer);
dbName = (String) TDTools.ReturnResource(context, R.string.dbName, TDTools.ResType.String);
dbPath = Environment.getExternalStorageDirectory() + (String) TDTools.ReturnResource(context, R.string.dbPath, TDTools.ResType.String);
Connection con = new Connection(context, dbVer, dbPath, dbName);
database = con.getReadableDatabase();
WhereArgs whereArgs = WhereArgs.CreateArguments(whereList);
if (select == null) {
select = new Select();
}
//Here is where i get 'No Such Table' error...
cursor = database.query("Category", select.getColumns(), whereArgs.getWhereClauses(), whereArgs.getArguments(), null, null, null, null);
return cursor;
}
请尝试使用大写的tablename类别。如果这不起作用,看看您是真的在打开创建的数据库还是刚刚打开了一个新数据库 您可以使用以下命令检查数据库中的Example:
SELECT name, sql FROM sqlite_master WHERE type='table' ORDER BY name;
更新
一般建议:在代码中添加日志,这样您就可以了解发生了什么
关于代码的一些想法:
} catch (SQLiteException e) {
if (checkDB != null) {
checkDB.close();
}
}
可能您想在这里设置chechDB=null,因为无法打开数据库,并且需要重新编译数据库
if (!dbExist) {
this.getReadableDatabase();
try {
CopyDatabase();
} catch (IOException e) {
throw new Error("Error.");
}
}
为什么在复制数据库之前要调用this.getReadableDatabase
更新2
您可以调用supercontext,dbName,null,dbVer;这意味着数据库文件dbName已打开。但是你要把数据库复制到这里。_dbPath+/+这个。_dbName!您必须使用相同的路径
super(context, dbPath + "/" + dbName, null, dbVer);
您是否在设备上卸载应用程序?每次安装仅部署一次资产。如果您将某些内容更改为DB文件,它将不会被自动替换。我现在尝试了它,但它不起作用:选择名称,sql FROM sqlite_master,其中type='table'按名称排序;这段代码只返回一个名为meta_datai的表。我更改了助手代码,就像您在第一条消息中所写的那样,但它没有更改任何内容。我在设置游标之前检查数据库,它是打开的。当我更改访问代码时,如database=SQLiteDatabase.openDatabasedbPath,null,SQLiteDatabase.open\u READONLY;而不是database=con.getReadableDatabase;我收到一个类似未知错误代码10的错误:无法打开数据库这是it人员。谢谢更新2工作得很好。再次感谢。回答得很好。
super(context, dbPath + "/" + dbName, null, dbVer);