光标列索引从手机更改为手机

时间:2014-06-02 17:44:24

标签: android orm android-cursor

我的应用程序允许用户拨打被呼出的最新号码。通过点击" Call"按钮带有一个空文本框,它将在我的ORM数据库中获取最新的传出号码。然而,这个问题只发生在某些手机上。

当我提取数据时,我会使用以下代码执行此操作:

Dao<RecentCallsInfo, Integer> dao = null;
if (getActivity() instanceof MainActivity) {
    MainActivity main = (MainActivity) getActivity();
    dao = main.getDatabaseHelper().getRecentDataDao();
}

QueryBuilder<RecentCallsInfo, Integer> qb = dao.queryBuilder();
qb.orderBy(RecentCallsInfo.RECENT_COLUMN_ID, false);
qb.where().eq(RecentCallsInfo.RECENT_COLUMN_CALL_TYPE, "Outgoing");

// when you are done, prepare your query and build an iterator
CloseableIterator<RecentCallsInfo> iterator = dao.iterator(qb.prepare());

// get the raw results which can be cast under Android
AndroidDatabaseResults results = (AndroidDatabaseResults)iterator.getRawResults();
Cursor c = results.getRawCursor();

if(c.moveToFirst()){
    if(!c.getString(RecentQuery.COLUMN_NUM).isEmpty()){
        System.out.println("Recent Record: \n Name:" + c.getString(RecentQuery.COLUMN_NAME) + 
        "\nNum:" + c.getString(RecentQuery.COLUMN_NUM) + "\nNumType:" + c.getString(RecentQuery.COLUMN_NUM_TYPE)+ 
        "\nCallType:" + c.getString(RecentQuery.COLUMN_CALL_TYPE));

        etcalle.setText(c.getString(RecentQuery.COLUMN_NUM));
     }
 }

 //RecentQuery.COLUMN_NAME = 5
 //RecentQuery.COLUMN_NUM = 6
 //RecentQuery.COLUMN_NUM_TYPE = 0
 //RecentQuery.COLUMN_CALL_TYPE = 2

当我调试c光标时,它会给我这些带有这些值的列

[recentNumberType, recentCallCost, recentCallType, recentCallerID, recentDate, recentName, recentNumber, _id]

Name:anthony
Num:(111) 111-1111
NumType:Mobile
CallType:Outgoing

当我在另一部手机上获得c光标时,我得到了

[recentCallCost, recentCallType, recentCallerID, recentDate, recentName, recentNumber, recentNumberType, _id]

Name:(111) 111-1111
Num:Mobile
NumType:FREE
CallType:1867

因此,当我尝试通过索引拉取数据时,我会得到不同的值。为什么会这样?这两部手机都是Nexus 5和4.4.2。

对此的任何见解都会很棒。谢谢!

1 个答案:

答案 0 :(得分:0)

列可以“更改”。例如,考虑这种情况。

  • 应用版本1创建T表,列A, C
  • 在版本2中,您想要更改数据库的结构。因此,您将B列添加到“创建表”脚本中。在新设备中,此表格将包含A, B, C列。
  • 但是,在onUpgrade()部分中,您只需添加列B(通过ALTER TABLE),结构最终将为A, C, B

一般来说,使用固定(“整数”)列索引是个坏主意,除非您还指定了所需的列(即不使用SELECT *)。使用getColumnIndex()(在循环之外)更安全。