【问题标题】:SQLiteException - no such tableSQLiteException - 没有这样的表
【发布时间】:2011-05-25 20:39:42
【问题描述】:

当我尝试访问我的视图时出现此错误

我已经使用它构建了我的数据库/视图

CREATE TABLE Boxer(
BoxerId INTEGER PRIMARY KEY AUTOINCREMENT,
Firstname NVARCHAR(50) NOT NULL,
Lastname NVARCHAR(50) NOT NULL
);

CREATE TABLE Match(
MatchId INTEGER PRIMARY KEY AUTOINCREMENT,
BoxerA INTEGER NOT NULL FOREIGN KEY REFERENCES Boxer(BoxerId),
BoxerB INTEGER NOT NULL FOREIGN KEY REFERENCES Boxer(BoxerId),
MatchDate date NOT NULL DEFAULT GETDATE(),
NumberOfRounds INTEGER NOT NULL DEFAULT  12
);

CREATE TABLE Round(
RoundId INTEGER PRIMARY KEY AUTOINCREMENT,
MatchId INTEGER NOT NULL FOREIGN KEY REFERENCES Match(MatchId),
BoxerA INTEGER NOT NULL DEFAULT 0,
BoxerB INTEGER NOT NULL DEFAULT 0,
Position INTEGER NOT NULL
);

/*
Building a view which dislpays matches with boxers names and total scores
*/
CREATE VIEW MatchDetail AS
SELECT Match.MatchId, A.BoxerId AS IdA, B.BoxerId AS IdB, A.Firstname + ' ' + A.Lastname         AS NameA, B.Firstname + ' ' + B.Lastname AS NameB,
(SELECT SUM(R.BoxerA) AS Score FROM Round AS R WHERE (R.MatchId = Match.MatchId)) AS ScoreA,
(SELECT SUM(R.BoxerB) AS Score FROM Round AS R WHERE (R.MatchId = Match.MatchId)) AS ScoreB, 
Match.MatchDate, Match.NumberOfRounds
FROM Boxer AS A INNER JOIN Match ON A.BoxerId = Match.BoxerA INNER JOIN Boxer AS B ON     Match.BoxerB = B.BoxerId

到目前为止,我已经使用记事本示例构建了我的应用程序,所以我随后调用了我的 DbHelper

Cursor MatchesCursor = mDbHelper.fetchAllMatchDetails();

然后调用查询

public Cursor fetchAllMatchDetails(){
    return mDb.query(VIEW_MATCHDETAIL, new String[] {
            "MatchId"
            }, null, null, null, null, null);
}

VIEW_MATCHDETAIL 被定义为一个字符串 = "MatchDetail"

它就在这里崩溃说

没有这样的表MatchDetail:编译时SELECT MatchId FROM MatchDetail

以前有人遇到过这个问题吗?

【问题讨论】:

  • 哦,所以你知道当我在本地 sql 数据库上运行创建脚本时,它会创建表并查看正常!
  • 我发现 SimpleCursorAdapter 需要一个“_id”列,所以我也为此更新了我的字段名称

标签: android sqlite


【解决方案1】:

那里有一些漂亮的 SQL。不幸的是,只有第一行 sql 将在 SQLiteDatabase.execSQL 中执行。其余的将被默默地忽略(方便吗?)。像这样手动拆分语句:

https://github.com/browep/fpt/blob/master/src/com/github/browep/nosql/NoSqlSqliteOpener.java

或者如果你想将你的 sql 保存在一个单独的文件中,试试这个:

String sqlText = getSqlText();
for(String sqlStmt : sqlText.split(";"))
     myDb.execSQL(slqStmt + ";");

【讨论】:

  • 哈哈,当我用 Questiod 探索我的 sqlite 数据库时,它只有一个拳击手表。我试试这个,看看我是否得到了所有 3 个数据库,如果是,那么转到我的查看。
【解决方案2】:

对我来说最突出的是NVARCHAR(50) 等数据类型的使用。 SQLite 只有一个very simple set of datatypes。我很惊讶它在安装应用程序时没有抛出异常。尝试简单地使用TEXT

【讨论】:

  • 那他们为什么要定义我链接的数据类型集呢?
  • @mikerobi:SQLite 3 并没有完全忽略数据类型。它使用它来确定列亲和性。但是NVARCHARTEXT没有区别。
  • @mikerobi @dan04 你的两个 cmets 对我来说都很有趣。谢谢。
【解决方案3】:

如果您无法访问已知已初始化的数据库,请尝试将创建表的 Activity 的上下文传递给尝试查询表的类。将该上下文用作连接初始化的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多