내 listview
내 목록보기에 특정 행 (sName
)이 표시되지 않습니다. UI
. 내게 sqlite
DB에 항목을 추가 할 수 있지만 내 listview
을 업데이트하려고 할 때 내 DB가 업데이트 될 때 새로 고치려고하면 내 목록보기가 비어 있습니다.Android ListView : 응용 프로그램이 커서 또는 데이터베이스 객체를 닫지 않았습니다.
데이터가 added\updated\removed
인 경우 오류 메시지가 표시되지 않습니다. 응용 프로그램이 시작될 때 커서 또는 DB가 닫히지 않았다는 logcat 오류가 발생합니다. "android.database.sqlite.DatabaseObjectNotClosedException:
응용 프로그램이 여기 열었던 커서 나 데이터베이스 개체를 닫지 않았습니다."라고 조언하십시오. logcat 및 코드는 다음과 같습니다.
활동
public class LoginList extends Activity implements OnClickListener, OnItemClickListener {
private ListView loginList;
private Button webLogin;
private ListAdapter loginListAdapter;
private ArrayList<LoginDetails> loginArrayList;
List<String> arrayList = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loginListAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList());
setContentView(R.layout.login_listview);
arrayList = populateList();
loginList = (ListView)
findViewById(R.id.loginlist);
loginList.setOnItemClickListener(this);
webLogin = (Button)
findViewById(R.id.button3);
webLogin.setOnClickListener(this);
}
@Override
public void onClick (View v) {
Intent webLoginIntent = new Intent (this, LoginPlusActivity.class);
startActivity(webLoginIntent);
}
public List<String> populateList(){
ArrayList<LoginDetails> loginArrayList = new ArrayList<LoginDetails>();
List<String> webNameList = new ArrayList<String>();
dataStore openHelperClass = new dataStore (this);
SQLiteDatabase sqliteDatabase = openHelperClass.getReadableDatabase();
Cursor cursor = sqliteDatabase.query(dataStore.TABLE_NAME_INFOTABLE, null, null, null, null, null, dataStore.COLUMN_NAME_SITE, null);
startManagingCursor(cursor);
while (cursor.moveToNext()){
String sName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_SITE));
String wUrl = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_ADDRESS));
String uName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_USERNAME));
String pWord = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_PASSWORD));
String lNotes = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_NOTES));
LoginDetails lpDetails = new LoginDetails();
lpDetails.setsName(sName);
lpDetails.setwUrl(wUrl);
lpDetails.setuName(uName);
lpDetails.setpWord(pWord);
lpDetails.setlNotes(lNotes);
loginArrayList.add(lpDetails);
webNameList.add(sName);
}
cursor.close();
sqliteDatabase.close();
return webNameList;
}
@Override
protected void onResume() {
super.onResume();
arrayList.clear();
arrayList = populateList();
SimpleCursorAdapter loginListAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null, null, null);
loginListAdapter.notifyDataSetChanged();
}
@Override
public void onItemClick(AdapterView<?> arg0 , View arg1, int arg2, long arg3) {
Toast.makeText(getApplicationContext(), "Selected ID :" + arg2, Toast.LENGTH_SHORT).show();
Intent updateDeleteLoginInfo = new Intent (this, UpdateDeleteLoginList.class);
LoginDetails clickedObject = loginArrayList.get(arg2);
Bundle loginBundle = new Bundle();
loginBundle.putString("clickedWebSite",clickedObject.getsName());
loginBundle.putString("clickedWebAddress",clickedObject.getwUrl());
loginBundle.putString("clickedUserName",clickedObject.getuName());
loginBundle.putString("clickedPassWord",clickedObject.getpWord());
loginBundle.putString("clickedNotes",clickedObject.getlNotes());
updateDeleteLoginInfo.putExtras(loginBundle);
startActivityForResult(updateDeleteLoginInfo, 0);
}
}
개정 활동 : 당신이 조회 또는 편집 후 커서 또는 데이터베이스에 close()를 호출하는 것을 잊었다처럼
public class LoginList extends FragmentActivity implements OnClickListener, OnItemClickListener, LoaderManager.LoaderCallbacks<Cursor> {
private ListView loginList;
private Button webLogin;
private CursorAdapter adapter;
private static final int LOADER_ID = 0x02;
private ArrayList<LoginDetails> loginArrayList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_listview);
getSupportLoaderManager().initLoader(LOADER_ID, null, this);
loginList = (ListView)
findViewById(R.id.loginlist);
loginList.setOnItemClickListener(this);
webLogin = (Button)
findViewById(R.id.button3);
webLogin.setOnClickListener(this);
loginArrayList = new ArrayList<LoginDetails>();
adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null,
new String[] { dataStore.COLUMN_NAME_SITE}, new int[]{R.id.textView1});
loginList.setAdapter(adapter);
}
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
return new CursorLoader(this, Uri.parse(null), null, null, null, null);
}
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
adapter.swapCursor(cursor);
}
public void onLoaderReset(Loader<Cursor> cursorLoader) {
adapter.swapCursor(null);
}
다른 활동에서 왔습니까? 데이터베이스를 닫았습니까? 또한'loginArrayList' 또는'loginListAdapter'로 아무 것도하지 않습니다 ... – Sam
아, 두 번째, 같은 이름의 로컬'loginArrayList'를 생성하는 것을 봅니다 ... 나는 자바가 당신을 어떻게 허용하는지 싫어합니다. 이 경고없이. 어쨌든이 줄을 제거하십시오 : ArrayList loginArrayList = new ArrayList ();'(CursorAdapter에서 Cursor를 사용하는 것이 가장 좋은 방법입니다.) –
Sam
하나의 경우,'startManagingCursor (cursor);'를 제거하십시오. 사용 중이 아니며 수동으로 '커서'를 관리하고 있습니다 ... –