【问题标题】:Android: sqlite - no such table exceptionAndroid:sqlite - 没有这样的表异常
【发布时间】:2012-10-05 09:57:04
【问题描述】:

我有以下代码(我对其进行了简化并删除了不相关的部分)

public class MyDatabaseManager extends SQLiteOpenHelper {

    private SQLiteDatabase myDatabase;

    public DatabaseManager() {
    super(MyApp.getAndroidContext(), DATABASE_NAME, null, DATABASE_VERSION);

    myDatabase = getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase database) {

    database.execSQL("create table t1 (t1key INTEGER PRIMARY KEY,data TEXT,num REAL,timeEnter NUMERIC);");

    }

    @Override
    public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
    }

}

现在,当我对该数据库运行查询时,我得到sqlite - no such table exception

我在database.execSQL 的断点命中并且它没有引发任何异常(例如,如果我将代码更改为database.execSQL("asda") 我得到语法错误异常)所以我认为我的SQL 代码是正确的。然而该表并未创建。 我将数据库文件复制到我的电脑上,然后用 Sqlite 浏览器查看了它,确实我的表不存在那里。只有一张桌子,叫做android_metadata。有什么想法吗?

【问题讨论】:

  • 您需要在创建和实例化 MyDatabaseManager 对象的位置放置代码。这通常是由于上下文变化而发生的。
  • 那里没有太多有趣的东西,我通过使用getApplicationContext()了解上下文
  • 您使用的超级调用是什么?您已将其注释掉...
  • 好的,我把它放在那里。 MyApp.getAndroidContext() 只返回private static android.content.Context m_Context;,它在MyApp.onCreate() 内初始化,代码为m_Context = getApplicationContext();

标签: android sqlite


【解决方案1】:

Sqlite 没有 DATE 的数据类型。我建议将其更改为 INTEGER 并将 date.getTime() 存储在其中。

【讨论】:

  • 我这样改了查询还是不行:create table t1 (t1key INTEGER PRIMARY KEY,data TEXT,num REAL,timeEnter NUMERIC);
  • 尝试增加数据库的版本号。可能是在您第一次运行代码时创建了数据库,但未创建表。现在,当您运行代码时,不会调用 onCreate() 方法,因为那里有一个空数据库。
  • 正如我提到的,我可以确认 onCreate() 被调用(我有一个断点)。当我的应用程序开始运行时,我一开始就删除了数据库(出于测试目的)。
  • 现在所有代码看起来都正常。向我们展示您在桌子上使用的一个或多个查询。
  • 您对DATE 的看法是正确的,但这不是唯一的问题。我现在修好了,谢谢。 +1
【解决方案2】:

更改您的查询并尝试以下操作:

create table t1 (_id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT,num REAL,timeEnter NUMERIC);

Android Sqlite 数据库表中应该有一个列_id,最好是autoincrement

【讨论】:

  • 我修好了,_id 列在 Sqllite 中不是必需的,问题是别的,但感谢您的帮助。 +1
【解决方案3】:

在实例化管理器时尝试通过更改构造函数来传递上下文,如下所示:

public MyDatabaseManager(Context ctx) {
 super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
}

public openDB() throws SQLException
{
 myDatabase = getWritableDatabase; 
}

现在将 getApplicationContext() 传递给 Activity 的 onCreate() 中的新 MyDatabaseManager 实例:

MyDatabaseManager manager = new MyDataBaseManager(getApplicationContext());
manager.openDB();

【讨论】:

  • 我修好了,这不是问题,但感谢您的帮助。 +1
【解决方案4】:

好的,我解决了这个问题。有多个问题:
1) 我的创建表查询有问题
2) 我正在以编程方式将数据库文件复制到onCreate 末尾的 sd 卡中,显然它还没有被写入。我把它移到myDatabase = getWritableDatabase(); 下,它工作了。

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2020-03-03
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    相关资源
    最近更新 更多