Android SQLite“没有这样的表”例外

我开始使用Android中的SQLite数据库而我刚刚发现了这个问题。 我已经阅读了很多类似的问题,但我还没有find解决方案。

这是我得到的错误:

E / AndroidRuntime(529):引起:android.database.sqlite.SQLiteException:没有这样的表:ligas_bd :,编译时:SELECT * FROM ligas_bd

这是我的代码。

DBHelper myDbHelper = new DBHelper(this); myDbHelper = new DBHelper(this); try { myDbHelper.createDataBase(); } catch (IOException ioe) { throw new Error("Unable to create database"); } try { myDbHelper.open(); SQLiteDatabase db = null; db = myDbHelper.getWritableDatabase(); String[] args = new String[] {""}; Cursor c = db.rawQuery(" SELECT * FROM ligas_bd", args); <---- Error in this line if (c.moveToFirst()) { do { String cod = c.getString(0); String nombre = c.getString(1); String flag = c.getString(0); String cod_url = c.getString(0); ligas.add(new Item_Liga(nombre, flag, cod, cod_url)); } while(c.moveToNext()); } }catch(SQLException sqle){ throw sqle; } 

DBHelper.java

 public class DBHelper extends SQLiteOpenHelper{ private static String DB_NAME = "ligas_bd"; private SQLiteDatabase myDataBase; private final Context myContext; public DBHelper(Context context) { super(context, DB_NAME, null, 1); this.myContext = context; } public void createDataBase() throws IOException{ boolean dbExist = checkDataBase(); if(dbExist){ } else { this.getReadableDatabase(); try { copyDataBase(); } catch (IOException e) { throw new Error("Error copiando Base de Datos"); } } } private boolean checkDataBase(){ SQLiteDatabase checkDB = null; try { String myPath = DB_PATH + DB_NAME; checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); } catch(SQLiteException e) { } if(checkDB != null) { checkDB.close(); } return checkDB != null ? true : false; } private void copyDataBase() throws IOException{ InputStream myInput = myContext.getAssets().open(DB_NAME); 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 open() throws SQLException{ try { createDataBase(); } catch (IOException e) { throw new Error("Ha sido imposible crear la Base de Datos"); } String myPath = DB_PATH + DB_NAME; myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); } @Override public synchronized void close() { if(myDataBase != null) myDataBase.close(); super.close(); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } 

我还使用root explorer data / data / mypackagename / databases检查了我的手机,数据库正常显示在那里。

我的数据库和主表具有相同的名称,您可以在此SQLite数据库浏览器中看到:

屏幕截图

我没有创建表,我在使用SQLite数据库浏览器之前创建了它,我只是想从中读取它


我不知道怎么回事,但我终于解决了。 我刚开始,这次是按照本教程进行的 。 希望能帮助到你!

Solutions Collecting From Web of "Android SQLite“没有这样的表”例外"

这只是猜测,但我可以看到这里发生了三件可能的事……

  1. createDatabase()方法中调用this.getReadableDatabase()会自动创建一个空数据库。
  2. 您尝试从assets文件夹中复制预先创建的数据库失败,或者数据库被复制到错误的位置。
  3. 在步骤1(上面)中创建的空数据库是从主代码调用db.rawQuery(...)时正在查询的空数据库。

为了进一步解释,查看SQLiteOpenHelper的源代码是有用的

当您创建SQLiteOpenHelper的实例时,它会设置数据库名称和版本之类的内容,但它不会创建数据库。 相反,第一次调用getReadableDatabase()getWritableDatabase()检查数据库是否存在,如果不存在则会创建数据库。 创建空数据库后,将调用onCreate(...)方法,在您的情况下,该方法不执行任何操作。

在第2点(上面) – 你说DB_PATH/data/data/mypackagename/databases 。 如果确实如此,你没有尾随/那么……

 String myPath = DB_PATH + DB_NAME; 

…将myPath设置为/data/data/mypackagename/databasesligas_db 。 在这种情况下,即使assets的副本成功,复制的数据库也不会像您期望的那样。

最后在第3点(上面)中,当您调用db.rawQuery(...)db指向的实例将由上一次调用getWritableDatabase() 。 假设assets的副本已失败或已将其复制到不正确的路径,则db将指向在步骤1中创建的空数据库。

您得到的错误是该表不存在,并且它不是指示数据库不存在的错误 – 唯一的逻辑解释是它在空数据库上执行查询而不是从已复制的数据库执行查询assets

编辑:我要提到的另一件事。 使用硬编码路径到任何Android目录都不是一个好主意。 例如 – 虽然在大多数设备上,创建数据库的目录将是/data/data//databases但这不是保证。 如果调用getDatabasePath(...)方法会更安全,因为它将返回一个File对象,该对象可用于获取Android数据库类使用的数据库目录的路径。

我有同样的问题并通过清理项目并从我的测试设备上删除应用程序并重新安装它来修复它。 我相信它发生是因为我跟着另一个错误地创建了一个空数据库的教程。 更正后的代码正在检索旧的空数据库。

如果您在设备中运行应用程序,请转到>>设置(在Android设备中)>>>应用程序>>>find您的应用程序>>清除数据和缓存。 之后,再次调试或安装新应用程序..

这样做我解决了这个问题……

exception很明显,你已经创建了数据库(ligas_db)但没有创建一个表(没有这样的表exception=没有名为ligas_db的表)

检查一下: http : //www.vogella.de/articles/AndroidSQLite/article.html

(¿Eres Antonio Recio?jaja)

你有ligas_bd作为数据库的名称,你正在尝试从中进行SELECT

在从中进行选择之前,您需要先创建表。 您可能以前创建过,但需要在打开数据库连接后创建它。

我的问题是我在路径名末尾留下了“/ databases /”。 令我感到困惑的是,在我加载dbconnection并将其存储为实例variables之前,代码工作正常。 然后当我需要使用getReadableDatabase()和getWritableDatabase()方法时,他们不断拉入在“真实”数据库路径中创建的空数据库。

INCORRECT / data / data / mypackagename /

CORRECT / data / data / mypackagename / databases /

给@Squonk +1的答案终于帮助我追踪了这个!

我有同样的问题尝试在文件名中包含.db扩展名,如:

 private static String DB_NAME = "ligas_bd.db";