ANDROID,JAVA:使用游标和循环获得重复结果 我是java中的NOOB,但我有一些C++知识,所以我用这个考虑做了循环。 我试图从两个数组中获取数据,其中包含数据库中的表名。如果任何表中的任何一个元素等于另一个表的元素,则两个表的两个名称都将保存在另一个数组中。这种情况一直持续到阵列结束。现在由于一些问题,每个游标多次包含同一个表,但我想我已经处理好了。 现在,通过使用下面的逻辑,我应该得到一个或两个不同的表对,但相反,我一次又一次地得到相同的表对。我多次改变循环顺序和逻辑,但这种形式至少给出了结果。 我认为问题在于逻辑而不是语法。我哪里出错了
我的代码是:ANDROID,JAVA:使用游标和循环获得重复结果 我是java中的NOOB,但我有一些C++知识,所以我用这个考虑做了循环。 我试图从两个数组中获取数据,其中包含数据库中的表名。如果任何表中的任何一个元素等于另一个表的元素,则两个表的两个名称都将保存在另一个数组中。这种情况一直持续到阵列结束。现在由于一些问题,每个游标多次包含同一个表,但我想我已经处理好了。 现在,通过使用下面的逻辑,我应该得到一个或两个不同的表对,但相反,我一次又一次地得到相同的表对。我多次改变循环顺序和逻辑,但这种形式至少给出了结果。 我认为问题在于逻辑而不是语法。我哪里出错了,java,android,arrays,loops,cursor,Java,Android,Arrays,Loops,Cursor,我的代码是: int maa; for (int i = 0; i < ArraySource.size(); i++) { // cursor for source Cursor sourceCursor = myDB.rawQuery("SELECT * FROM '" + ArraySource.get(i) + "';", null); int sourceIndex = sourceCursor.getColu
int maa;
for (int i = 0; i < ArraySource.size(); i++) {
// cursor for source
Cursor sourceCursor = myDB.rawQuery("SELECT * FROM '" + ArraySource.get(i) + "';", null);
int sourceIndex = sourceCursor.getColumnIndex("Stop");
for (int ii = 0; ii < ArrayDest.size(); ii++) {
// counter for finding match
maa=0;
Cursor destCursor = myDB.rawQuery("SELECT * FROM '" + ArrayDest.get(ii) + "';", null);
int destIndex = destCursor.getColumnIndex("Stop");
sourceCursor.moveToFirst();
String nameSource = sourceCursor.getString(sourceIndex);
destCursor.moveToFirst();
String nameDest = destCursor.getString(destIndex);
// data is repeated many times in the cursor, so this is hack to take the first result and check with every result
// so if match is found loop is broken
// But to do that first result should be taken out of loop, hence the following
// First result of first cursor checking with first result of second cursor
if (nameSource.equals(nameDest)){
IndirectArray1.add(ArraySource.get(i));
IndirectArray2.add(ArrayDest.get(ii));
maa=1;
}else {
//checking with all results of second cursor
for (destCursor.moveToNext(); !destCursor.isAfterLast(); destCursor.moveToNext()) {
if(nameDest.equals(destCursor.getString(destIndex))){
break;
}
if (nameSource.equals(destCursor.getString(destIndex))) {
IndirectArray1.add(ArraySource.get(i));
IndirectArray2.add(ArrayDest.get(ii));
maa=1;
break;
}
}
}
// condition for running nexr for loop above logic is used in following loop
if(maa ==0){
MsMoot:
for (sourceCursor.moveToNext(); !sourceCursor.isAfterLast(); sourceCursor.moveToNext()) {
destCursor.moveToFirst();
if (nameSource.equals(sourceCursor.getString(sourceIndex))) {
break;
}
if (sourceCursor.getString(sourceIndex).equals(destName)) {
IndirectArray1.add(ArraySource.get(i));
IndirectArray2.add(ArrayDest.get(ii));
break;
}else {
for (destCursor.moveToNext(); !destCursor.isAfterLast(); destCursor.moveToNext()) {
if (destCursor.getString(destIndex).equals(nameDest)) {
break;
}
if (sourceCursor.getString(sourceIndex).equals(destCursor.getString(destIndex))) {
IndirectArray1.add(ArraySource.get(i));
IndirectArray2.add(ArrayDest.get(ii));
break MsMoot;
}
}
}
}
// closing cursors
}destCursor.close();
}sourceCursor.close();
}
它看起来像无限循环。您将获得重复的行,因为您尝试循环所有内容,并且多次重复。在结果中,您多次获得每个表的第一行,然后某些值在某些时候被标记为相同。游标对特定表进行查询,并存储数据。现在,您应该读取所有数据,并以更人性化的方式存储它们。然后检查存储的数据是否相等。下面是示例代码。 @编辑 现在,对于存储在ArraySource列表中的每个表,您正在为ArrayTest列表中的每个表调用查询,然后我放入foreach循环,检查firstList中的每个字符串是否等于secondList中的每个字符串。这应该能正常工作。
据我所知,此循环将检查firstlist的第一个结果和secondlist的所有结果,然后检查firstlist的第二个结果和secondlist的所有结果,依此类推。我是否应该在j循环之上为firstlist的所有结果添加一个额外的循环?它成功了!谢谢你的逻辑。您的解决方案总共为我节省了100多行。
for(int i = 0; i < ArraySource.size(); i++) {
List<String> firstList = new ArrayList<>();
List<String> secondList = new ArrayList<>();
Cursor sourceCursor = myDB.rawQuery("SELECT * FROM '" + ArraySource.get(i) + "';", null);
if(sourceCursor != null) {
if(sourceCursor.moveToFirst()) {
do {
String a = sourceCursor.getString(0);
firstList.add(a);
} while(sourceCursor.moveToNext());
}
}
sourceCursor.close();
for (int j = 0; j < ArrayDest.length; j++) {
Cursor destCursor = myDB.rawQuery("SELECT * FROM '" + ArrayDest.get(j) + "';", null);
if (destCursor != null) {
if (destCursor.moveToFirst()) {
do {
String b = destCursor.getString(0);
secondList.add(b);
} while (destCursor.moveToNext());
}
}
destCursor.close();
for (String one : firstList) {
for (int k = 0; k < secondList.size(); k++) {
String two = secondList.get(k);
if (one.equals(two)) {
//make your logic here
}
}
}
}
}