2016-06-10 16 views
0

我有这样的方法:光标没有结果后SQLite的查询(通过单元测试,但在运行时出现故障)返回 - 安卓

public Note getNoteById(long id) { 
    Cursor cursor = database.query(Config.NOTES_TABLE, Config.NOTES_COLUMNS, Config.ROW_ID+"="+id, null, null, null, Config.ROW_ID + " DESC"); 

    //no match found 
    if(cursor.getCount() == 0) 
     return null; 

    cursor.moveToFirst(); 
    Note result = new Note(); 
    result.setId(cursor.getLong(cursor.getColumnIndex(Config.ROW_ID))); 
    result.setTitle(cursor.getString(cursor.getColumnIndex(Config.TITLE))); 
    result.setText(cursor.getString(cursor.getColumnIndex(Config.TEXT))); 
    result.setViewOrder(cursor.getLong(cursor.getColumnIndex(Config.VIEW_ORDER))); 
    result.setCreated(cursor.getString(cursor.getColumnIndex(Config.CREATED))); 
    result.createTagsFromString(cursor.getString(cursor.getColumnIndex(Config.TAGS))); 

    return result; 
} 

我的问题是在第几行。在开始处的游标总是以0计数返回,因此使该函数总是返回null - 仅在运行时! - 我为这个方法写了一个测试用例,它通过了,所以我不知道为什么它只会在运行时失败?

继承人测试用例的相关部分。我基本上插入新的数据表中,并试图通过它的id把它找回来,并比较属性,以确认其是相同的:

@Test 
public void testGetNoteByIdMatch(){ 
    testTable.load(); 

    Assert.assertEquals(0, testTable.getAllNotes().getCount()); 

    testTable.newEntry(note1); 
    testTable.newEntry(note2); 

    Cursor cursor = testTable.getAllNotes(); 
    Assert.assertEquals(2, testTable.getAllNotes().getCount()); 
    cursor.moveToFirst(); 

    Note result = new Note(); 
    result.setId(cursor.getLong(cursor.getColumnIndex(Config.ROW_ID))); 
    result.setTitle(cursor.getString(cursor.getColumnIndex(Config.TITLE))); 
    result.setText(cursor.getString(cursor.getColumnIndex(Config.TEXT))); 

    Note checker = testTable.getNoteById(result.getId()); 
    Assert.assertEquals(result.getId(), checker.getId()); 
    Assert.assertEquals(result.getTitle(), checker.getTitle()); 

    //move and try another search 
    cursor.moveToNext(); 
    result = new Note(); 
    result.setId(cursor.getLong(cursor.getColumnIndex(Config.ROW_ID))); 
    result.setTitle(cursor.getString(cursor.getColumnIndex(Config.TITLE))); 
    result.setText(cursor.getString(cursor.getColumnIndex(Config.TEXT))); 

    checker = testTable.getNoteById(result.getId()); 
    Assert.assertEquals(result.getId(), checker.getId()); 
    Assert.assertEquals(result.getTitle(), checker.getTitle()); 

} 

这是数据库的onCreate方法表结构:

@Override 
public void onCreate(SQLiteDatabase db) { 

    db.execSQL("CREATE TABLE " + Config.NOTES_TABLE + " (" + 
      Config.ROW_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
      Config.TITLE + " TEXT NOT NULL, " + 
      Config.TEXT + " TEXT NOT NULL, " + 
      Config.CREATED + " TEXT NOT NULL, " + 
      Config.VIEW_ORDER + " INTEGER NOT NULL, " + 
      Config.TAGS + " TEXT NOT NULL)" 
    ); 

} 
+0

您正在WHERE子句中指定ROW_ID。您确定该行存在于您的数据库中吗?你有没有用WHERE子句试过它? – maccaroo

+0

是的,我确定。我事先插入了数据,所以我知道在调用函数之前存在什么...我以调试模式跟踪了程序...一切正常,直到它碰到方法的第一行....并且测试用例对于这种情况,通过... –

+0

您将需要发布一个更完整的示例,至少包含Config合同对象的详细信息。我们现在所能做的就是猜测你... – maccaroo

回答

1

您的测试检查值是否可以按照插入的顺序读出,但并未实际验证数据是否按预期进行。结果和检查器对象可能都具有所有属性的空值。确认对象属性在从数据库中读出后具有预期值。

+0

已添加为答案,因为解决方案是在问题的评论中计算出来的。 – maccaroo