Android SQLite“没有这样的表”异常

Posted

技术标签:

【中文标题】Android SQLite“没有这样的表”异常【英文标题】:Android SQLite "no such table" exception 【发布时间】:2012-04-12 13:56:57 【问题描述】:

我开始研究 android 中的 SQLite 和数据库,我刚刚发现了这个问题。我已经阅读了很多类似的问题,但我还没有找到解决方案。

这是我得到的错误:

E/AndroidRuntime(529): Caused by: android.database.sqlite.SQLiteException: no such table: ligas_bd: , while compile: 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 数据库浏览器之前创建了它,我只是想从中读取数据


我不知道如何,但我终于修好了。我刚刚重新开始,这次关注this tutorial。 希望对您有所帮助!

【问题讨论】:

是数据库所在的路径。它是 /data/data/mypackagename/databases 【参考方案1】:

使用TFDQuery.Open('commands')TFDQuery.ExecSql('commands') 这解决了我的问题。

【讨论】:

【参考方案2】:

遇到同样的问题,我建议不要使用 rawQuery

SQLiteDatabase DB=this.getWritableDatabase();
Cursor data;
String[] columns = "deviceid";
String selection = "deviceid" + " =?";
String[] selectionArgs =  devicename ;
data=DB.query("Btconnection",columns,selection,selectionArgs,null,null,null);

【讨论】:

【参考方案3】:

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

private static String DB_NAME = "ligas_bd.db";

【讨论】:

【参考方案4】:

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

我通过这样做解决了这个问题......

【讨论】:

【参考方案5】:

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

不正确 /data/data/mypackagename/

正确 /data/data/mypackagename/databases/

+1 给@Squonk,他的回答终于帮我找到了!

【讨论】:

【参考方案6】:

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

【讨论】:

您先生,应该得到比我所能给予的更多的支持。我也有这个错误,你的建议就是解决这个问题的方法。谢谢!!!! 就我而言,我必须使用全新的模拟器,但这对我也有用 最有可能是答案 我尝试卸载/重新安装应用程序但是重新安装应用程序后出现同样的错误。我现在该怎么办【参考方案7】:

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

【讨论】:

我不明白你的意思。我在使用它自己的编辑器之前创建了它,现在我必须在代码中创建它?以及如何做到这一点? 你正在使用这个:db = myDbHelper.getWritableDatabase();在此之后编写代码以创建表(如果不存在)。或在创建表语句之前打开数据库连接。 我想从我放在资产文件夹中的现有数据库中获取表,我不想创建任何表 okey.then 你需要将你的数据库从你的 assets 文件夹复制到 /data/data/your_package_name/database/ 路径。然后可以打开数据库。检查您的数据库路径。你应该复制 .sqlite 文件。重命名为 .sqlite。 如果您看到上面显示的代码,我也会这样做。我还尝试将文件重命名为 .sqlite ,结果是一样的。无论如何,我终于可以解决它了。【参考方案8】:

这只是一个猜测,但我可以看到这里发生了三种可能的事情......

    在您的 createDatabase() 方法中调用 this.getReadableDatabase() 会自动创建一个空数据库。 您尝试从 assets 文件夹复制预先创建的数据库失败,或者数据库被复制到错误的位置。 在第 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/&lt;package-name&gt;/databases,但这不是保证。如果调用getDatabasePath(...) 方法会更安全,因为它会返回一个File 对象,该对象可用于获取Android 数据库类使用的数据库目录的路径。

【讨论】:

路径没问题,最后有“/”,所以这不是错误。如果我更改路径,则会引发另一个异常,因此路径正常并且可以正确找到数据库。这是一件很奇怪的事情 @koneX:在这种情况下,请尝试调用File dbFile = getDatabasePath("ligas_bd") 并使用logcat 记录dbFile 对象的路径,或者简单地使用Toast 显示它。在您的主代码中调用 db.rawQuery(...) 之前立即执行此操作。这至少会显示SQLiteOpenHelper 用于访问数据库的路径。 @Squonk:你是对的。我遇到了同样的问题,我使用了 public SQLiteDatabase opendatabase() try String mypath = DB_PATH + DB_NAME;数据库 = SQLiteDatabase.openDatabase(mypath, null,SQLiteDatabase.OPEN_READWRITE); catch(SQLiteException sle) System.out.println("打开数据库时出现异常:"+sle); 返回数据库; 而不是 getWritableDatabase();【参考方案9】:

您有 ligas_bd 作为数据库的名称,并且您正尝试从中获取 SELECT

【讨论】:

数据库和表同名,请参见上面帖子中的编辑。谢谢【参考方案10】:

异常很明显,您创建了数据库 (ligas_db) 但其中没有表(没有这样的表异常 = 没有名为 ligas_db 的表)

检查这个:http://www.vogella.de/articles/AndroidSQLite/article.html

(¿Eres Antonio Recio?jaja)

【讨论】:

数据库名和表名一样,编辑见上图。谢谢(不,没有大豆 Antonio Recio jajajajaja)

以上是关于Android SQLite“没有这样的表”异常的主要内容,如果未能解决你的问题,请参考以下文章

android.database.sqlite.SQLiteException:没有这样的表:国家(代码 1 SQLITE_ERROR)

如何解决android.database.sqlite.SQLiteException:没有这样的表错误?

在 SQLite Android 中发现“没有这样的表”错误

android.database.sqlite.SQLiteException:没有这样的表:table_name

FATAL EXCEPTION:后台任务android.database.sqlite.SQLiteException:没有这样的表。

java.lang.RuntimeException:android.database.sqlite.SQLiteException:没有这样的表:media_store_extension(代码1)