我使用While循环使用Cursor类将SQL表的值添加到ArrayList中,但是在添加所有值的时刻,While循环停止给出值,但同时它没有&# 39;继续下一个陈述。我使用的条件是:如果在While循环中,Cursor有空值,它需要停止(c!= null),它停止但不会继续。我使用Log.i查看我是否在While循环后收到值,但我没有得到任何价值。这是我正在使用的代码:
static ArrayList<String> notes = new ArrayList<>();
static ArrayAdapter arrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.listView);
try{
SQLiteDatabase sqLiteDatabase = this.openOrCreateDatabase("Notes",MODE_PRIVATE, null);
sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS notes (name VARCHAR)");
sqLiteDatabase.execSQL("INSERT INTO notes (name) VALUES ('LUIS GA')");
sqLiteDatabase.execSQL("INSERT INTO notes (name) VALUES ('LUIS')");
sqLiteDatabase.execSQL("INSERT INTO notes (name) VALUES ('GA')");
Cursor c = sqLiteDatabase.rawQuery("SELECT * FROM notes", null);
int nameIndex = c.getColumnIndex("name");
notes.add("example note");
c.moveToFirst();
arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, notes);
listView.setAdapter(arrayAdapter);
int i = 0;
Log.i("Bucefalo", Integer.toString(i));
while(c != null){
Log.i("Dato",c.getString(nameIndex));
notes.add(c.getString(nameIndex));
c.moveToNext();
i++;
Log.i("Luis", Integer.toString(i));
};
i = 2;
Log.i("Napoleon", Integer.toString(i));
String Hercules = "Hercules";
Log.i("Hercules",Hercules);
}
catch (Exception e){
e.printStackTrace();
}
我使用Log.i在Logcat中收到的值是&#34; Bucefalo&#34;和#34; Luis&#34; (在While循环中的那个),但我没有收到价值&#34;拿破仑&#34;和&#34; Hercules&#34;,为什么?我怎么解决这个问题?谢谢
答案 0 :(得分:2)
这是迭代光标的最佳方式
if (newService.info_requires[i] === undefined) {
newService.info_requires[i] = {};
}
newService.info_requires[i].name = (service.info_requires[i].name);
答案 1 :(得分:2)
除了错误使用游标之外,这段代码
while(c != null){
...
c.moveToNext();
}
实际上永远不会停止循环。
您会看到:您有一个本地参考 c 。它是不为空。在 上调用方法绝对不能将引用本身变为 null 。只有像c = null
这样的作业才能到达那里。
换句话说:您发布的代码不支持您对观察到的行为的声明。
答案 2 :(得分:0)
JSON.stringify(elementArray);
返回一个布尔值,但同时它继续并移动光标。
像这样使用,
moveToNext
或
Cursor c = sqLiteDatabase.rawQuery(....);
while (c.moveToNext()) {
}
答案 3 :(得分:0)
您的while循环中存在语法错误。应该低于
while (expression)
{
statemets(s)
}
而且你使用光标很糟糕。
你可以使用
cur.moveToFirst();
while (cur.isAfterLast() == false) {
.............
............
cur.moveToNext();
}
cur.close();
或
Cursor cursor = db.rawQuery(...);
if (cursor.moveToFirst()) {
do {
...
或
} while (cursor.moveToNext());
}
Cursor cursor = db.rawQuery(...);
try {
while (cursor.moveToNext()) {
...
}
} finally {
cursor.close();
}