Android SQLExceptions列表

时间:2014-03-15 08:35:13

标签: android sqlite sqlexception

我正在尝试撰写一篇关于在Android中捕获SQL异常的文章。我想只是列出所有可能的异常类型及其可能发生的描述。

我当然访问了Android SQLException这样的网站,但信息很少......只是例外的名称。

举个例子(这个例子非常明显但我希望它们都在一篇文章中): android.database.sqlite。 SQLiteException:没有这样的列:test(代码1) - 当查询中的列错误时抛出。在升级数据库时处理此问题可能很有用。错误消息包含缺少列​​的名称和sqlite错误代码,在这种情况下意味着:SQL错误或缺少数据库

只需在Android中分享您对SQL异常的影响即可。提前谢谢!

1 个答案:

答案 0 :(得分:1)

如果您确实希望列出所有可能类型的例外,那么要求社区分享他们的经验将不足以实现目标。我担心你不得不付出更多的努力来完成你的任务。当然,这可能是值得的!

我建议你做两件事:

  1. 检查Android的源代码;
  2. 检查SQLite文档,尤其是结果代码(https://www.sqlite.org/c3ref/c_abort.html),也可能是源代码。
  3. 如果它是关于Android的,它的来源确实有很好的文档,而且代码很干净。首先,您可以从半自动方法开始 - 通过java文件的rgrep。你可以找到很多你正在寻找的信息:

    $ rgrep SQLite . | grep Exception |grep throw
    ./sqlite/SQLiteStatement.java:     * @throws android.database.sqlite.SQLiteDoneException if the query returns zero rows
    [...]
    ./sqlite/SQLiteOpenHelper.java:                    throw new SQLiteException("Can't upgrade read-only database from version " +
    ./sqlite/SQLiteOpenHelper.java:        throw new SQLiteException("Can't downgrade database from version " +
    ./sqlite/SQLiteQueryBuilder.java:     * If the SQL statement is not valid, this method will throw a {@link SQLiteException}.
    [...]
    

    然后你可以更进一步 - 手动浏览它。您可能会发现SQLite *异常并不是唯一抛出的异常。例如,在android.database.DatabaseUtils中,您可能会找到这样的方法:

    public static final void writeExceptionToParcel(Parcel reply, Exception e) {
        int code = 0;
        boolean logException = true;
        if (e instanceof FileNotFoundException) {
            code = 1;
            logException = false;
        } else if (e instanceof IllegalArgumentException) {
            code = 2;
        } else if (e instanceof UnsupportedOperationException) {
            code = 3;
        } else if (e instanceof SQLiteAbortException) {
            code = 4;
        } else if (e instanceof SQLiteConstraintException) {
            code = 5;
        } else if (e instanceof SQLiteDatabaseCorruptException) {
            code = 6;
        } else if (e instanceof SQLiteFullException) {
            code = 7;
        } else if (e instanceof SQLiteDiskIOException) {
            code = 8;
        } else if (e instanceof SQLiteException) {
            code = 9;
        } else if (e instanceof OperationApplicationException) {
            code = 10;
        } else if (e instanceof OperationCanceledException) {
            code = 11;
            logException = false;
        } else {
            reply.writeException(e);
            Log.e(TAG, "Writing exception to parcel", e);
            return;
        }
        reply.writeInt(code);
        reply.writeString(e.getMessage());
    
        if (logException) {
            Log.e(TAG, "Writing exception to parcel", e);
        }
    }
    

    您需要找到代码的来源并记录下来。或者它可能已经记录在某处 - 我不知道。

    总而言之,你正在尝试做一些看似简单的事情,但事实上并非如此。如果您想描述可能发生的所有种类的异常,则需要大量工作。决定这是否是你想要的,或者写下最常见的例外就足够了。

    顺便说一句,在SQLiteException: no such column: test (code 1)异常的情况下,我认为“在升级数据库时处理这个问题可能有用”。这意味着架构与代码不匹配。它应该尽快失败 - 这是了解您的代码无效并且需要修复的最佳方式。但这只是我的评论,不是关于你问题的本质。