1

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); 
} 
+0

다른 활동에서 왔습니까? 데이터베이스를 닫았습니까? 또한'loginArrayList' 또는'loginListAdapter'로 아무 것도하지 않습니다 ... – Sam

+0

아, 두 번째, 같은 이름의 로컬'loginArrayList'를 생성하는 것을 봅니다 ... 나는 자바가 당신을 어떻게 허용하는지 싫어합니다. 이 경고없이. 어쨌든이 줄을 제거하십시오 : ArrayList loginArrayList = new ArrayList ();'(CursorAdapter에서 Cursor를 사용하는 것이 가장 좋은 방법입니다.) – Sam

+0

하나의 경우,'startManagingCursor (cursor);'를 제거하십시오. 사용 중이 아니며 수동으로 '커서'를 관리하고 있습니다 ... –

답변

1

보인다.

SQLiteDatabase db;//your database 
//do your work... 
//If you query in your database: 
Cursor c=db.rawQuery(...);//or something like that 
//fetch data from cursor 
c.close(); 
db.close();