gpt4 book ai didi

android - 应用程序没有关闭游标或数据库对象android

转载 作者:行者123 更新时间:2023-11-29 19:10:30 25 4
gpt4 key购买 nike

我正在尝试通过 AsyncTask 中的联系人簿中的号码查找联系人姓名。有时我会收到以下错误,我认为这会导致应用程序崩溃。请提供任何帮助。

日志

08-05 09:00:49.627 24988-27371/com.fake.fake E/CursorLeakDetecter: PossibleCursorLeak:content://com.android.contacts/phone_lookup/%2B923310433708,QueryCounter:5
android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
at android.content.ContentResolver.query(ContentResolver.java:323)
at com.fake.fake.GV.getContactName(GV.java:177)
at com.fake.fake.MySQLiteHelper.GetNumbers(MySQLiteHelper.java:361)
at com.fake.fake.MainActivity$taskLoadContacts.doInBackground(MainActivity.java:930)
at com.fake.fake.MainActivity$taskLoadContacts.doInBackground(MainActivity.java:921)
at android.os.AsyncTask$2.call(AsyncTask.java:264)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)

从数据库中检索联系电话。

 public ArrayList<MyMessageDetails> GetNumbers(String query) {
ArrayList<MyMessageDetails> numbers = new ArrayList<MyMessageDetails>();
Cursor cursor = db.rawQuery(query, null);
if (cursor != null && cursor.moveToFirst()) {
do {
MyMessageDetails item = new MyMessageDetails();
item.setNumber(cursor.getString(0));
String name = GV.getContactName(item.getNumber());
if (name == null) {
name = item.getNumber();
}
item.setName(name);
item.setTime(cursor.getString(3));
numbers.add(item);
} while (cursor.moveToNext());

}
return numbers;
}

正在检索联系人姓名。

 public static String getContactName(String phoneNumber) {
if (phoneNumber != null) {
ContentResolver cr = ApplicationContextProvider.getContext().getContentResolver();
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);
if (cursor == null) {
return "";
}
String contactName = null;
if (cursor.moveToFirst()) {
contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
}

if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
return contactName;
}

return phoneNumber;
}

最佳答案

从中读取数据后使用Cursor#close()。示例:

Cursor cursor = ...
try {
// fetch whatever you need here
} finally {
cursor.close();
}

关于android - 应用程序没有关闭游标或数据库对象android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45542790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com