【问题标题】:"No Such Table" Error found in SQLite Android在 SQLite Android 中发现“没有这样的表”错误
【发布时间】:2021-10-20 22:10:49
【问题描述】:

我正在尝试学习 SQLite 数据库,但我真的很讨厌处理任何后端的东西,而且充满热情。我已经遇到了一个看似简单的问题。

这是我认为DatabaseHelper 类中重要的代码

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "Library";

    public static final String TABLE_NAME = "books";
    public static final String TITLE = "title";
    public static final String AUTHOR = "author";
    public static final String ISBN = "isbn";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, author TEXT, isbn TEXT)");
    }


    public boolean insertBook(String title, String author, String isdn) {

        try {
            SQLiteDatabase db = getWritableDatabase();

            ContentValues cv = new ContentValues();
            cv.put(TITLE, title);
            cv.put(AUTHOR, author);
            cv.put(ISBN, isdn);

            db.insert(TABLE_NAME, null, cv);
            db.close();

            return true;
        } catch (Exception exp) {
            exp.printStackTrace();

            return false;
        }
    }
}

这是我主要活动中的代码

dbHelper = new DatabaseHelper(this);

dbHelper.insertBook("Harry Potter", "JK", "1000");
dbHelper.insertBook("Hamlet", "Shakespeare", "500");

Eclipse 告诉我insertBook() 方法中存在错误。它说有no such table books: ...。我不知道我在这里做错了什么。更令人沮丧的是,就在它完美运行前几分钟,然后(我认为)我放下了桌子,它只是出于某种原因再次创建它,即使自从我第一次创建它以来这段代码没有改变(我认为...)。

【问题讨论】:

  • 你能添加实际的堆栈跟踪吗?

标签: java android sqlite


【解决方案1】:

您的设备上有旧版本的数据库,它确实有(空)数据库,但没有 books 表。如果您愿意,只需卸载并重新安装该应用即可。

稍后,当您想在最终用户设备上的生产过程中向数据库添加新表但保留现有数据时,添加新表、更改架构或升级数据的指定挂钩是 @987654322 @你的SQLiteOpenHelper的方法。

【讨论】:

  • 我有 onUpgrade 方法,但每次向数据库添加表时都会出现此错误。 Here 你可以看到我的代码和我的错误。我应该在 onUpgrade 中添加什么以避免此错误?
【解决方案2】:

我为此编写了一个 ORM 框架。 https://github.com/ahmetalpbalkan/orman

您可以使用 SQLite 轻松编写 Android 应用程序。它使用您的 Java 类(在本例中为 Book)作为数据库表(实体)。

它甚至会自动创建您的表格,您只需说book1.insert(),完成。

【讨论】:

    【解决方案3】:

    您必须卸载应用程序,然后重新安装。之后它应该可以工作了。

    【讨论】:

      【解决方案4】:

      试试这个 例如插入:

       public boolean insertBook(String title, String author, String isdn) {
      
              try {
                  SQLiteDatabase db = getWritableDatabase();
      
                  ContentValues cv = new ContentValues();
                  cv.put(TITLE, title);
                  cv.put(AUTHOR, author);
                  cv.put(ISBN, isdn);
      
                  ***try
                   {
                  db.insert(TABLE_NAME, null, cv);
      }
       catch ( SQLiteException e)
              {
                  onCreate(db);
        db.insert(TABLE_NAME, null, cv);
      }***
      
                  db.close();
      
                  return true;
              } catch (Exception exp) {
                  exp.printStackTrace();
      
                  return false;
              }
          }
      

      【讨论】:

        【解决方案5】:

        这没有任何意义,因为表从数据库的一开始就存在,所以我们尝试了不同的方法:

        1. 卸载应用

        2. 清理缓存/数据

        3. 更改数据库版本号

        4. 强制复制数据库,即使它已经存在

        【讨论】:

          【解决方案6】:

          如果由于某种原因删除了表,您可能希望删除数据库以强制应用程序正确地重新创建它。使用adb shell 并在/data/data/[package_name]/databases/ 中找到数据库。您可以删除该文件。

          【讨论】:

            【解决方案7】:

            我遇到了这个问题,但是清理项目并没有解决它。
            原来我通过了DATABASE_NAME 而不是TABLE_NAME

            【讨论】:

              【解决方案8】:

              确保调用了onCreate 方法。创建多个表时,我也面临类似类型的问题。如果您创建一个单独的类,请确保您首先清除应用程序的所有存储数据,然后再次运行它。它对我来说可以正常工作。

              【讨论】:

                【解决方案9】:
                db.execSQL(
                    "CREATE TABLE " + TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, author TEXT, isbn TEXT)"
                );
                

                去掉表名后面的空格,应该是这样的。

                db.execSQL(
                    "CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, author TEXT, isbn TEXT)"
                );
                

                【讨论】:

                  【解决方案10】:

                  注意:

                  您访问时必须为 Sqliteopenhelper 类中的路径添加的外部数据库

                  public final static String DATABASE_PATH = "/data/data/com.example.shortcuts/databases/";

                  com.example.shortcuts=你的包名

                  【讨论】:

                  • 欢迎来到 SO。为确保高质量的答案,请确保您使用完整的句子并简短地与问题相关。纯代码片段没有太大帮助,所以请编辑。 PS:我为你修正了排版。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-05-11
                  • 2010-12-29
                  • 1970-01-01
                  • 2019-03-13
                  • 1970-01-01
                  • 2016-11-18
                  相关资源
                  最近更新 更多