我的应用程序允许用户拨打被呼出的最新号码。通过点击" 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。
对此的任何见解都会很棒。谢谢!
答案 0 :(得分:0)
列可以“更改”。例如,考虑这种情况。
A, C
B
列添加到“创建表”脚本中。在新设备中,此表格将包含A, B, C
列。B
(通过ALTER TABLE
),结构最终将为A, C, B
。一般来说,使用固定(“整数”)列索引是个坏主意,除非您还指定了所需的列(即不使用SELECT *
)。使用getColumnIndex()
(在循环之外)更安全。