【问题标题】:Why does my app crash in my mobile phone but not on AVD emulator?为什么我的应用程序在我的手机中崩溃,但在 AVD 模拟器上却没有?
【发布时间】:2014-01-01 13:00:19
【问题描述】:

我编写了一个使用 SQLite db 的应用程序。在第一阶段,当我不使用 SQLite 并且只使用普通字段来存储数据时,我的应用程序在我的手机上运行得很好。但是现在当我使用 SQLite 有效地存储和提取数据时,我的应用程序在我的手机中崩溃了。有趣的一点是它在我的计算机上的 AVD 模拟器上运行良好。知道为什么会这样吗?

这是我的数据库类:

public class WordsDB extends SQLiteOpenHelper {

    static final String DATABASE_NAME = "DicDB";

    static final String TermTable = "Terms";
    static final String ID = "id";
    static final String Selected = "selected";
    static final String Term = "term";
    static final String Br = "br_phon";
    static final String NAm = "nam_phon";
    static final String Type = "type";
    static final String Noun = "noun";
    static final String Verb = "verb";
    static final String Adjective = "adjective";
    static final String Adverb = "adverb";

    static final String DefTable = "Definitions";
    static final String Def = "definition";
    static final String Ex = "example";

    public static final int DATABASE_VERSION = 1;

    private static final String TERM_TABLE_CREATE = "Create table " + TermTable +
        "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
        Selected + " VARCHAR(5) ," +
        Term + " VARCHAR(20) ," +
        Br + " VARCHAR(20) ," +
        NAm + " VARCHAR(20) ," +
        Type + " VARCHAR(10) ," +
        Noun + " VARCHAR(20) ," +
        Verb + " VARCHAR(20) ," +
        Adjective + " VARCHAR(20) ," +
        Adverb + " VARCHAR(20)) ";

    private static final String DEF_TABLE_CREATE = "Create table " + DefTable +
        "(" + ID + " INTEGER PRIMARY KEY ," +
        Def + " VARCHAR(30) ," +
        Ex + " VARCHAR(160)) ";

    public WordsDB(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
    db.execSQL(TERM_TABLE_CREATE);
    db.execSQL(DEF_TABLE_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        db.execSQL("DROP TABLE IF EXISTS " + TermTable);
        db.execSQL("DROP TABLE IF EXISTS " + DefTable);
        onCreate(db);
    }
}

这里是 DataSource 类:

public class WordsDS {

    private WordsDB dbHelper;
    private SQLiteDatabase db;

    public WordsDS(Context context) {
        dbHelper = new WordsDB(context);
    }

    public void open() throws SQLException {
        db = dbHelper.getWritableDatabase();
    }

    public void close() {
        db.close();
    }

    // Methods to inset, update and extract data from table
    .......
}

我在我的主要活动中从 WordsDS 类中创建一个对象,并通过 open 方法获得可写数据库等等,在我的其他类中,我使用 WordsDS 对象并通过它插入、更新和提取数据。

【问题讨论】:

  • 除了代码,贴出logcat的异常stacktrace。
  • @Ali 您如何使用设备调试您的应用程序?您是否正在导出 .apk 文件并将其安装在设备上?如果是这样,请尝试将您的设备连接到您的计算机并像在模拟器上一样进行调试。这样您就可以访问 log cat 和 crash 日志。顺便说一句,由于信息有限,现在任何人都无法帮助您,也许您可​​以发布错误日志和源代码,我们可以帮助调试。
  • @user88975 是的,我在我的设备上安装了生成的 .apk 文件。但我无法尝试调试模式。我的移动调试模式在我的计算机上不起作用,我无法通过 DDMS 访问它。有什么办法解决吗?
  • 看看这个answer希望对你有帮助
  • “我的移动调试模式在我的电脑上不起作用”——那么你需要先解决这个问题。

标签: android sqlite avd


【解决方案1】:

首先,您必须卸载该应用才能进行全新安装。这意味着创建的所有数据库都将在您的手机上被擦除。这将确保如果添加新列或数据库结构发生更改,将创建数据库。您可能认为 onUpgrade 方法会为您完成这个技巧,但它不会!

至于在移动设备上调试您的应用。首先,您必须在计算机上安装手机的驱动程序。然后你现在可以在之后运行 adb logcat。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2019-10-19
    • 1970-01-01
    相关资源
    最近更新 更多