當前位置:首頁 » 凈水方式 » cursor過濾android

cursor過濾android

發布時間: 2021-03-02 07:45:33

Ⅰ 在移動前端中,android設備如何去除cursor-pointer的點擊高亮

ead>
<script type="text/javascript">
function mOver(object)
{
object.color="red";
}
function mOut(object)
{
object.color="blue";
}

</script>

<body>
<font style="cursor: pointer"
onclick="window.location.href='http://www..com'" onmouseover="mOver(this)" onmouseout="mOut(this)">歡迎訪問!</font>
</body>
</html>
cursor:hand 與 cursor:pointer 的效果是一樣,都像手形游標。但用FireFox瀏覽時才注意到使用cursor:hand在FireFox里並被支持。
cursor:hand :IE完全支持。但是在firefox是不支持的,沒有效果。

Ⅱ android中用cursor游標取資料庫數據

把讀取的數據存起來就可以了~

ArrayList<HashMap<String,Object>>temp=newArrayList<HashMap<String,Object>>();
if(cursor.moveToFirst()){
do{
HashMap<String,Object>map=newHashMap<String,Object>();
Stringname=cursor.getString(cursor.getColumnIndex("fromuser"));
Stringtoname=cursor.getString(cursor.getColumnIndex("touser"));
Stringcontent=cursor.getString(cursor.getColumnIndex("content"));
Stringdate=cursor.getString(cursor.getColumnIndex("date"));
Stringtype=cursor.getString(cursor.getColumnIndex("type"));
map.put("fromuser",name);
//其他數據同
temp.add(map);
}while(cursor.moveToNext());
}
//讀取數據
Stringname1=temp.get(1).get("name").toString();

Ⅲ Android如何檢測 Cursor 泄漏

有一些泄漏在代碼中難以察覺,但程序長時間運行後必然會出現異常。同時該方法同樣適合於其他需要檢測資源泄露的情況。最近發現某蔬菜手機連接程序在查詢媒體存儲(MEdiaProvider)資料庫時出現嚴重 Cursor 泄漏現象,運行一段時間後會導致系統中所有使用到該資料庫的程序無法使用。另外在工作中也常發現有些應用有 Cursor 泄漏現象,由於需要長時間運行才會出現異常,所以有的此類 bug 很長時間都沒被發現。但是一旦 Cursor 泄漏累計到一定數目(通常為數百個)必然會出現無法查詢資料庫的情況,只有等資料庫服務所在進程死掉重啟才能恢復正常。通常的出錯信息如下,指出某 pid 的程序打開了 866 個 Cursor 沒有關閉,導致了 exception:3634 3644 E JavaBinder: *** Uncaught remote exception! (Exceptions are not yet supported across processes.) 3634 3644 E JavaBinder: android.database.: Cursor window allocation of 2048 kb failed. # Open Cursors=866 (# cursors opened by pid 1565=866) 3634 3644 E JavaBinder: at android.database.CursorWindow.(CursorWindow.java:104) 3634 3644 E JavaBinder: at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198) 3634 3644 E JavaBinder: at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:147) 3634 3644 E JavaBinder: at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:141) 3634 3644 E JavaBinder: at android.database.CursorToBulkCursorAdaptor.getBulkCursorDescriptor(CursorToBulkCursorAdaptor.java:143) 3634 3644 E JavaBinder: at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:118) 3634 3644 E JavaBinder: at android.os.Binder.execTransact(Binder.java:367) 3634 3644 E JavaBinder: at dalvik.system.NativeStart.run(Native Method)1. Cursor 檢測原理在Cursor 對象被 JVM 回收運行到 finalize() 方法的時候,檢測 close() 方法有沒有被調用,此辦法在 ContentResolver 裡面也得到應用。簡化後的示例代碼如下:import android.database.Cursor; import android.database.CursorWrapper; import android.util.Log; public class TestCursor extends CursorWrapper { private static final String TAG = "TestCursor"; private boolean mIsClosed = false; private Throwable mTrace; public TestCursor(Cursor c) { super(c); mTrace = new Throwable("Explicit termination method 'close()' not called"); } @Override public void close() { mIsClosed = true; } @Override public void finalize() throws Throwable { try { if (mIsClosed != true) { Log.e(TAG, "Cursor leaks", mTrace); } } finally { super.finalize(); } } }然後查詢的時候,把 TestCursor 作為查詢結果返回給 APP:return new TestCursor(cursor); // cursor 是普通查詢得到的結果,例如從 ContentProvider.query()該方法同樣適合於所有需要檢測顯式釋放資源方法沒有被調用的情形,是一種通用方法。但在 finalize() 方法里檢測需要注意。優點:准確。因為該資源在 Cursor 對象被回收時仍沒被釋放,肯定是發生了資源泄露。缺點:依賴於 finalize() 方法,也就依賴於 JVM 的垃圾回收策略。例如某 APP 現在有 10 個 Cursor 對象泄露,並且這 10 個對象已經不再被任何引用指向處於可回收狀態,但是 JVM 可能並不會馬上回收(時間不可預測),如果你現在檢查不能夠發現問題。另外,在某些情況下就算對象被回收 finalize() 可能也不會執行,也就是不能保證檢測出所有問題。關於 finalize() 更多信息可以參考《Effective Java 2nd Edition》的 Item 7: Avoid Finalizers2. 使用方法對於APP 開發人員從GINGERBREAD 開始 Android 就提供了 StrictMode 工具協助開發人員檢查是否不小心地做了一些不該有的操作。使用方法是在 Activity 裡面設置 StrictMode,下面的例子是打開了檢查泄漏的 SQLite 對象以及 Closeable 對象(普通 Cursor/FileInputStream 等)的功能,發現有違規情況則記錄 log 並使程序強行退出。import android.os.StrictMode; public class TestActivity extends Activity { private static final boolean DEVELOPER_MODE = true; public void onCreate() { if (DEVELOPER_MODE) { StrictMode.setVMPolicy(new StrictMode.VMPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog() .penaltyDeath() .build()); } super.onCreate(); } }對於framework 開發人員如果是通過 ContentProvider 提供資料庫數據,在 ContentResolver 裡面已有 CloseGuard 類實行類似檢測,但需要自行打開(上例也是打開 CloseGuard):CloseGuard.setEnabled(true);更值得推薦的辦法是按照本文第一節中的檢測原理,在 ContentResolver 內部類 CursorWrapperInner 裡面加入。其他需要檢測類似於資源泄漏的,同樣可以使用該檢測原理。3. 容易出錯的地方忘記調用 close() 這種低級錯誤沒什麼好說的,這種應該也占不小的比例。下面說說不太明顯的例子。提前返回有時候粗心會犯這種錯誤,在 close() 調用之前就 return 了,特別是函數比較大邏輯比較復雜時更容易犯錯。這種情況可以通過把 close() 放在 finally 代碼塊解決。private void method() { Cursor cursor = query(); // 假設 query() 是一個查詢資料庫返回 Cursor 結果的函數 if (flag == false) { // !!提前返回 return; } cursor.close(); }類的成員變數假設類裡面有一個在類全局有效的成員變數,在方法 A 獲取了查詢結果,後面在其他地方又獲取了一次查詢結果,那麼第二次查詢的時候就應該先把前面一個 Cursor 對象關閉。public class TestCursor { private Cursor mCursor; private void methodA() { mCursor = query(); } private void methodB() { // !!必須先關閉上一個 cursor 對象 mCursor = query(); } }注意:曾經遇到過有人對 mCursor 感到疑惑,明明是同一個變數為什麼還需要先關閉?首先 mCursor 是一個 Cursor 對象的引用,在 methodA 時 mCursor 指向了 query() 返回的一個 Cursor 對象 1;在 methodB() 時它又指向了返回的另外一個 Cursor 對象 2。在指向 Cursor 對象 2 之前必須先關閉 Cursor 對象 1,否則就出現了 Cursor 對象 1 在 finalize() 之前沒有調用 close() 的情況。異常處理打開和關閉 Cursor 之間的代碼出現 exception,導致沒有跑到關閉的地方:try { Cursor cursor = query(); // 中間省略某些出現異常的代碼 cursor.close(); } catch (Exception e) { // !!出現異常沒跑到 cursor.close() }這種情況應該把 close() 放到 finally 代碼塊裡面:Cursor cursor = null; try { cursor = query(); // 中間省略某些出現異常的代碼 } catch (Exception e) { // 出現異常 } finally { if (cursor != null) cursor.close(); }4. 總結思考在finalize() 裡面檢測是可行的,且基本可以滿足需要。針對 finalize() 執行時間不確定以及可能不執行的問題,可以通過記錄目前打開沒關閉的 Cursor 數量來部分解決,超過一定數目發出警告,兩種手段相結合。還有沒有其他檢測辦法呢?有,在 Cursor 構造方法以及 close() 方法添加 log,運行一段時間後檢查 log 看哪個地方沒有關閉。簡化代碼如下:import android.database.Cursor; import android.database.CursorWrapper; import android.util.Log; public class TestCursor extends CursorWrapper { private static final String TAG = "TestCursor"; private Throwable mTrace; public TestCursor(Cursor c) { super(c); mTrace = new Throwable("cusor opened here"); Log.d(TAG, "Cursor " + this.hashCode() + " opened, stacktrace is: ", mTrace); } @Override public void close() { mIsClosed = true; Log.d(TAG, "Cursor " + this.hashCode() + " closed."); } }檢查時看某個 hashCode() 的 Cursor 有沒有調用過 close() 方法,沒有的話說明資源有泄露。這種方法優點是同樣准確,且更可靠。

Ⅳ 如何檢測 Android Cursor 泄漏

有一些泄漏在代碼中難以察覺,但程序長時間運行後必然會出現異常。同時該方法同樣適合於其他需要檢測資源泄露的情況。 最近發現某蔬菜手機連接程序在查詢媒體存儲(MediaProvider)資料庫時出現嚴重 Cursor 泄漏現象,運行一段時間後會導致系統中所有使用到該資料庫的程序無法使用。另外在工作中也常發現有些應用有 Cursor 泄漏現象,由於需要長時間運行才會出現異常,所以有的此類 bug 很長時間都沒被發現。但是一旦 Cursor 泄漏累計到一定數目(通常為數百個)必然會出現無法查詢資料庫的情況,只有等資料庫服務所在進程死掉重啟才能恢復正常。通常的出錯信息如下,指出某 pid 的程序打開了 866 個 Cursor 沒有關閉,導致了 exception:3634 3644 E JavaBinder: *** Uncaught remote exception! (Exceptions are not yet supported across processes.) 3634 3644 E JavaBinder: android.database.: Cursor window allocation of 2048 kb failed. # Open Cursors=866 (# cursors opened by pid 1565=866) 3634 3644 E JavaBinder: at android.database.CursorWindow.(CursorWindow.java:104) 3634 3644 E JavaBinder: at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198) 3634 3644 E JavaBinder: at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:147) 3634 3644 E JavaBinder: at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:141) 3634 3644 E JavaBinder: at android.database.CursorToBulkCursorAdaptor.getBulkCursorDescriptor(CursorToBulkCursorAdaptor.java:143) 3634 3644 E JavaBinder: at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:118) 3634 3644 E JavaBinder: at android.os.Binder.execTransact(Binder.java:367) 3634 3644 E JavaBinder: at dalvik.system.NativeStart.run(Native Method) 1. Cursor 檢測原理在Cursor 對象被 JVM 回收運行到 finalize() 方法的時候,檢測 close() 方法有沒有被調用,此辦法在 ContentResolver 裡面也得到應用。簡化後的示例代碼如下: 1import android.database.Cursor; 2import android.database.CursorWrapper; 3import android.util.Log; 4 5publicclass TestCursor extends CursorWrapper { 6privatestaticfinal String TAG = "TestCursor"; 7privateboolean mIsClosed = false; 8private Throwable mTrace; 910public TestCursor(Cursor c) { 11super(c); 12 mTrace = new Throwable("Explicit termination method 'close()' not called"); 13 } 1415 @Override 16publicvoid close() { 17 mIsClosed = true; 18 } 1920 @Override 21publicvoid finalize() throws Throwable { 22try { 23if (mIsClosed != true) { 24 Log.e(TAG, "Cursor leaks", mTrace); 25 } 26 } finally { 27super.finalize(); 28 } 29 } 30 }然後查詢的時候,把 TestCursor 作為查詢結果返回給 APP:1returnnew TestCursor(cursor); // cursor 是普通查詢得到的結果,例如從 ContentProvider.query() 該方法同樣適合於所有需要檢測顯式釋放資源方法沒有被調用的情形,是一種通用方法。但在 finalize() 方法里檢測需要注意優點:准確。因為該資源在 Cursor 對象被回收時仍沒被釋放,肯定是發生了資源泄露。缺點:依賴於 finalize() 方法,也就依賴於 JVM 的垃圾回收策略。例如某 APP 現在有 10 個 Cursor 對象泄露,並且這 10 個對象已經不再被任何引用指向處於可回收狀態,但是 JVM 可能並不會馬上回收(時間不可預測),如果你現在檢查不能夠發現問題。另外,在某些情況下就算對象被回收 finalize() 可能也不會執行,也就是不能保證檢測出所有問題。關於 finalize() 更多信息可以參考《Effective Java 2nd Edition》的 Item 7: Avoid Finalizers2. 使用方法對於APP 開發人員從GINGERBREAD 開始 Android 就提供了 StrictMode 工具協助開發人員檢查是否不小心地做了一些不該有的操作。使用方法是在 Activity 裡面設置 StrictMode,下面的例子是打開了檢查泄漏的 SQLite 對象以及 Closeable 對象(普通 Cursor/FileInputStream 等)的功能,發現有違規情況則記錄 log 並使程序強行退出。 1import android.os.StrictMode; 2 3publicclass TestActivity extends Activity { 4privatestaticfinalboolean DEVELOPER_MODE = true; 5publicvoid onCreate() { 6if (DEVELOPER_MODE) { 7 StrictMode.setVMPolicy(new StrictMode.VMPolicy.Builder() 8 .detectLeakedSqlLiteObjects() 9 .detectLeakedClosableObjects() 10 .penaltyLog() 11 .penaltyDeath() 12 .build()); 13 } 14super.onCreate(); 15 } 16 } 對於framework 開發人員如果是通過 ContentProvider 提供資料庫數據,在 ContentResolver 裡面已有 CloseGuard 類實行類似檢測,但需要自行打開(上例也是打開 CloseGuard):1 CloseGuard.setEnabled(true);更值得推薦的辦法是按照本文第一節中的檢測原理,在 ContentResolver 內部類 CursorWrapperInner 裡面加入。其他需要檢測類似於資源泄漏的,同樣可以使用該檢測原理。3. 容易出錯的地方忘記調用 close() 這種低級錯誤沒什麼好說的,這種應該也占不小的比例。下面說說不太明顯的例子。提前返回有時候粗心會犯這種錯誤,在 close() 調用之前就 return 了,特別是函數比較大邏輯比較復雜時更容易犯錯。這種情況可以通過把 close() 放在 finally 代碼塊解決1privatevoid method() { 2 Cursor cursor = query(); // 假設query() 是一個查詢資料庫返回 Cursor 結果的函數3if (flag == false) { //!!提前返回4return; 5 } 6 cursor.close(); 7 } 類的成員變數假設類裡面有一個在類全局有效的成員變數,在方法 A 獲取了查詢結果,後面在其他地方又獲取了一次查詢結果,那麼第二次查詢的時候就應該先把前面一個 Cursor 對象關閉。 1publicclass TestCursor { 2private Cursor mCursor; 3 4privatevoid methodA() { 5 mCursor = query(); 6 } 7 8privatevoid methodB() { 9//!!必須先關閉上一個 cursor 對象10 mCursor = query(); 11 } 12 }注意:曾經遇到過有人對 mCursor 感到疑惑,明明是同一個變數為什麼還需要先關閉?首先 mCursor 是一個 Cursor 對象的引用,在 methodA 時 mCursor 指向了 query() 返回的一個 Cursor 對象 1;在 methodB() 時它又指向了返回的另外一個 Cursor 對象 2。在指向 Cursor 對象 2 之前必須先關閉 Cursor 對象 1,否則就出現了 Cursor 對象 1 在 finalize() 之前沒有調用 close() 的情況。異常處理打開和關閉 Cursor 之間的代碼出現 exception,導致沒有跑到關閉的地方:1try { 2 Cursor cursor = query(); 3// 中間省略某些出現異常的代碼4 cursor.close(); 5 } catch (Exception e) { 6//!!出現異常沒跑到 cursor.close()7 }這種情況應該把 close() 放到 finally 代碼塊裡面: 1 Cursor cursor = null; 2try { 3 cursor = query(); 4// 中間省略某些出現異常的代碼 5 } catch (Exception e) { 6// 出現異常 7 } finally { 8if (cursor != null) 9 cursor.close(); 10 }4. 總結思考在finalize() 裡面檢測是可行的,且基本可以滿足需要。針對 finalize() 執行時間不確定以及可能不執行的問題,可以通過記錄目前打開沒關閉的 Cursor 數量來部分解決,超過一定數目發出警告,兩種手段相結合。還有沒有其他檢測辦法呢?有,在 Cursor 構造方法以及 close() 方法添加 log,運行一段時間後檢查 log 看哪個地方沒有關閉。簡化代碼如下: 1import android.database.Cursor; 2import android.database.CursorWrapper; 3import android.util.Log; 4 5publicclass TestCursor extends CursorWrapper { 6privatestaticfinal String TAG = "TestCursor"; 7private Throwable mTrace; 8 9public TestCursor(Cursor c) { 10super(c); 11 mTrace = new Throwable("cusor opened here"); 12 Log.d(TAG, "Cursor " + this.hashCode() + " opened, stacktrace is: ", mTrace); 13 } 1415 @Override 16publicvoid close() { 17 mIsClosed = true; 18 Log.d(TAG, "Cursor " + this.hashCode() + " closed."); 19 } 20 }檢查時看某個 hashCode() 的 Cursor 有沒有調用過 close() 方法,沒有的話說明資源有泄露。這種方法優點是同樣准確,且更可靠。

Ⅳ 如何檢測 Android Cursor 泄漏

在 Cursor 構造方法以及 close() 方法添加 log,運行一段時間後檢查 log 看哪個地方沒有關閉。簡化代碼如下:

1 import android.database.Cursor;
2 import android.database.CursorWrapper;
3 import android.util.Log;
4
5 public class TestCursor extends CursorWrapper {
6 private static final String TAG = "TestCursor";
7 private Throwable mTrace;
8
9 public TestCursor(Cursor c) {
10 super(c);
11 mTrace = new Throwable("cusor opened here");
12 Log.d(TAG, "Cursor " + this.hashCode() + " opened, stacktrace is: ", mTrace);
13 }
14
15 @Override
16 public void close() {
17 mIsClosed = true;
18 Log.d(TAG, "Cursor " + this.hashCode() + " closed.");
19 }
20 }
求採納

Ⅵ 如何檢測 Android Cursor 泄漏

Cursor 檢測原理
在 Cursor 對象被 JVM 回收運行到 finalize() 方法的時候,檢測 close() 方法有沒有被調用,此辦法在 ContentResolver 裡面也得到應用。簡化後的示例代碼如下:

1 import android.database.Cursor;
2 import android.database.CursorWrapper;
3 import android.util.Log;
4
5 public class TestCursor extends CursorWrapper {
6 private static final String TAG = "TestCursor";
7 private boolean mIsClosed = false;
8 private Throwable mTrace;
9
10 public TestCursor(Cursor c) {
11 super(c);
12 mTrace = new Throwable("Explicit termination method 'close()' not called");
13 }
14
15 @Override
16 public void close() {
17 mIsClosed = true;
18 }
19
20 @Override
21 public void finalize() throws Throwable {
22 try {
23 if (mIsClosed != true) {
24 Log.e(TAG, "Cursor leaks", mTrace);
25 }
26 } finally {
27 super.finalize();
28 }
29 }
30 }

然後查詢的時候,把 TestCursor 作為查詢結果返回給 APP:
1 return new TestCursor(cursor); // cursor 是普通查詢得到的結果,例如從 ContentProvider.query()

該方法同樣適合於所有需要檢測顯式釋放資源方法沒有被調用的情形,是一種通用方法。但在 finalize() 方法里檢測需要注意
優點:准確。因為該資源在 Cursor 對象被回收時仍沒被釋放,肯定是發生了資源泄露。
缺點:依賴於 finalize() 方法,也就依賴於 JVM 的垃圾回收策略。例如某 APP 現在有 10 個 Cursor 對象泄露,並且這 10 個對象已經不再被任何引用指向處於可回收狀態,但是 JVM 可能並不會馬上回收(時間不可預測),如果你現在檢查不能夠發現問題。另外,在某些情況下就算對象被回收 finalize() 可能也不會執行,也就是不能保證檢測出所有問題。關於 finalize() 更多信息可以參考《Effective Java 2nd Edition》的 Item 7: Avoid Finalizers。

Ⅶ CursorAdapter如何實現關鍵字過濾

其中Filterable介面定義了getFilter()這個介面。 CursorFilterClient定義如下介面: convertToString(Cursor cursor); Cursor runQueryOnBackgroundThread(CharSequence constraint); Cursor getCursor(); void changeCursor(Cursor cursor); 注意:CursorFilter.CursorFilterClient是非public的,所以只有文檔中看不到它,在源碼中才能看到它。 CursorAdapter.java文件如下 package android.widget;-----------------------------------省略---------------------------------public abstract class CursorAdapter extends BaseAdapter implements Filterable, CursorFilter.CursorFilterClient { /** * This field should be made private, so it is hidden from the SDK. * {@hide}*/ protected boolean mDataValid; /** * This field should be made private, so it is hidden from the SDK. * {@hide}*/ protected boolean mAutoRequery; /** * This field should be made private, so it is hidden from the SDK. * {@hide}*/ protected Cursor mCursor;-----------------------------------省略--------------------------------- protected CursorFilter mCursorFilter; /** * This field should be made private, so it is hidden from the SDK. * {@hide}*/ protected FilterQueryProvider mFilterQueryProvider;-----------------------------------省略--------------------------------- public Cursor getCursor() { return mCursor; }-----------------------------------省略--------------------------------- public void changeCursor(Cursor cursor) {-----------------------------------省略--------------------------------- }-----------------------------------省略--------------------------------- public CharSequence convertToString(Cursor cursor) { return cursor == null ? "" : cursor.toString(); }-----------------------------------省略--------------------------------- public Cursor runQueryOnBackgroundThread(CharSequence constraint) { if (mFilterQueryProvider != null) { return mFilterQueryProvider.runQuery(constraint); } return mCursor; } public Filter getFilter() { if (mCursorFilter == null) { mCursorFilter = new CursorFilter(this); } return mCursorFilter; }-----------------------------------省略--------------------------------- public FilterQueryProvider getFilterQueryProvider() { return mFilterQueryProvider; }-----------------------------------省略--------------------------------- public void setFilterQueryProvider(FilterQueryProvider filterQueryProvider) { mFilterQueryProvider = filterQueryProvider; }-----------------------------------省略---------------------------------} CursorFilter文件如下: package android.widget;import android.database.Cursor;class CursorFilter extends Filter { CursorFilterClient mClient; interface CursorFilterClient { CharSequence convertToString(Cursor cursor); Cursor runQueryOnBackgroundThread(CharSequence constraint); Cursor getCursor(); void changeCursor(Cursor cursor); } CursorFilter(CursorFilterClient client) { mClient = client; } @Override public CharSequence convertResultToString(Object resultValue) { return mClient.convertToString((Cursor) resultValue); } @Override protected FilterResults performFiltering(CharSequence constraint) { Cursor cursor = mClient.runQueryOnBackgroundThread(constraint); FilterResults results = new FilterResults(); if (cursor != null) { results.count = cursor.getCount(); results.values = cursor; } else { results.count = 0; results.values = null; } return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { Cursor oldCursor = mClient.getCursor(); if (results.values != null && results.values != oldCursor) { mClient.changeCursor((Cursor) results.values); } }} 關於Filter的更多內容參見《關鍵字過濾器Filter》。 調用CursorAdapter的getFilter方法得到一個Filter,調用它的filter (CharSequence constraint)方法。其中constraint就是關鍵字。 注意1:如果不給CursorAdapter設置FilterQueryProvider(通過setFilterQueryProvider方法), 那麼就需要重載Cursor runQueryOnBackgroundThread(CharSequence constraint)來實現對資料庫的過濾查詢。 當然FilterQueryProvider其實就是在它唯一的方法public abstract Cursor runQuery (CharSequence constraint)裡面實現對資料庫的過濾查詢。

Ⅷ android 分離cursor

不太了解你的需求,一般從資料庫拿到cursor,轉換成列表list使用的,在轉換列表的時候可以分2個列表,比如:
ArrayList<E> list1 = new ArrayList<E>();
ArrayList<E2> list2 = new ArrayList<E2>();
Cursor cursor = managedQuery(getIntent().getData(), list_column.PROJECTION,null,null ,null);
while(cursor.moveToNext()){
E e = new E();//這個是你第一個列表裡面裝的模型
E2 e2 = new E2();//這個是第二個列表裡面的模型
e.item1 = cursor.getString(0);//具體按照自己的類型分,我以String類型為例
e.item2 = cursor.getString(1);
e.item3 = cursor.getString(2);
e.item4 = cursor.getString(3);
e.item5 = cursor.getString(4);
e2.item1 = cursor.getString(5);//第二的模型的數據
e2.item2 = cursor.getString(6);
e2.item3 = cursor.getString(7);
e2.item4 = cursor.getString(8);
e2.item5 = cursor.getString(9);
}
這樣就分成2個列表了。你看看這樣符合你的需求不

Ⅸ 如何檢測 Android Cursor 泄漏

本文介紹如何在 Android 檢測 Cursor 泄漏的原理以及使用方法,還指出幾種常見的出錯示例。有一些泄漏在代碼中難以察覺,但程序長時間運行後必然會出現異常。同時該方法同樣適合於其他需要檢測資源泄露的情況。

最近發現某蔬菜手機連接程序在查詢媒體存儲(MediaProvider)資料庫時出現嚴重
Cursor 泄漏現象,運行一段時間後會導致系統中所有使用到該資料庫的程序無法使用。另外在工作中也常發現有些應用有 Cursor
泄漏現象,由於需要長時間運行才會出現異常,所以有的此類 bug 很長時間都沒被發現。
但是一旦 Cursor 泄漏累計到一定數目(通常為數百個)必然會出現無法查詢資料庫的情況,只有等資料庫服務所在進程死掉重啟才能恢復正常。通常的出錯信息如下,指出某 pid 的程序打開了 866 個 Cursor 沒有關閉,導致了 exception:
3634 3644 E JavaBinder: *** Uncaught remote exception! (Exceptions are not yet supported across processes.)
3634
3644 E JavaBinder: android.database.:
Cursor window allocation of 2048 kb failed. # Open Cursors=866 (#
cursors opened by pid 1565=866)
3634 3644 E JavaBinder: at android.database.CursorWindow.(CursorWindow.java:104)
3634 3644 E JavaBinder: at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
3634 3644 E JavaBinder: at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:147)
3634 3644 E JavaBinder: at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:141)
3634
3644 E JavaBinder: at
android.database.CursorToBulkCursorAdaptor.getBulkCursorDescriptor(CursorToBulkCursorAdaptor.java:143)
3634 3644 E JavaBinder: at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:118)
3634 3644 E JavaBinder: at android.os.Binder.execTransact(Binder.java:367)
3634 3644 E JavaBinder: at dalvik.system.NativeStart.run(Native Method)

1. Cursor 檢測原理
在 Cursor 對象被 JVM 回收運行到 finalize() 方法的時候,檢測 close() 方法有沒有被調用,此辦法在 ContentResolver 裡面也得到應用。簡化後的示例代碼如下:

import android.database.Cursor;
import android.database.CursorWrapper;
import android.util.Log;

public class TestCursor extends CursorWrapper {
private static final String TAG = "TestCursor";
private boolean mIsClosed = false;
private Throwable mTrace;

public TestCursor(Cursor c) {
super(c);
mTrace = new Throwable("Explicit termination method 'close()' not called");
}

@Override
public void close() {
mIsClosed = true;
}

@Override
public void finalize() throws Throwable {
try {
if (mIsClosed != true) {
Log.e(TAG, "Cursor leaks", mTrace);
}
} finally {
super.finalize();
}
}
}

然後查詢的時候,把 TestCursor 作為查詢結果返回給 APP:
1 return new TestCursor(cursor); // cursor 是普通查詢得到的結果,例如從 ContentProvider.query()

該方法同樣適合於所有需要檢測顯式釋放資源方法沒有被調用的情形,是一種通用方法。但在 finalize() 方法里檢測需要注意
優點:准確。因為該資源在 Cursor 對象被回收時仍沒被釋放,肯定是發生了資源泄露。
缺點:依賴於 finalize() 方法,也就依賴於 JVM 的垃圾回收策略。例如某
APP 現在有 10 個 Cursor 對象泄露,並且這 10 個對象已經不再被任何引用指向處於可回收狀態,但是 JVM
可能並不會馬上回收(時間不可預測),如果你現在檢查不能夠發現問題。另外,在某些情況下就算對象被回收 finalize()
可能也不會執行,也就是不能保證檢測出所有問題。關於 finalize() 更多信息可以參考《Effective Java 2nd
Edition》的 Item 7: Avoid Finalizers

Ⅹ 如何檢測 Android Cursor 泄漏


Cursor
對象被
JVM
回收運行到
finalize()
方法的時候,檢測
close()
方法有沒有被調用,此辦法在
ContentResolver
裡面也得到應用。簡化後的示例代碼如下:
import
android.database.Cursor;
import
android.database.CursorWrapper;
import
android.util.Log;
public
class
TestCursor
extends
CursorWrapper
{
private
static
final
String
TAG
=
"TestCursor";
private
boolean
mIsClosed
=
false;
private
Throwable
mTrace;

public
TestCursor(Cursor
c)
{
super(c);
mTrace
=
new
Throwable("Explicit
termination
method
'close()'
not
called");
}

@Override
public
void
close()
{
mIsClosed
=
true;
}

@Override
public
void
finalize()
throws
Throwable
{
try
{
if
(mIsClosed
!=
true)
{
Log.e(TAG,
"Cursor
leaks",
mTrace);
}
}
finally
{
super.finalize();
}
}
}
然後查詢的時候,把
TestCursor
作為查詢結果返回給
APP:
1
return
new
TestCursor(cursor);
//
cursor
是普通查詢得到的結果,例如從
ContentProvider.query()
該方法同樣適合於所有需要檢測顯式釋放資源方法沒有被調用的情形,是一種通用方法。但在
finalize()
方法里檢測需要注意
優點:准確。因為該資源在
Cursor
對象被回收時仍沒被釋放,肯定是發生了資源泄露。
缺點:依賴於
finalize()
方法,也就依賴於
JVM
的垃圾回收策略。例如某
APP
現在有
10

Cursor
對象泄露,並且這
10
個對象已經不再被任何引用指向處於可回收狀態,但是
JVM
可能並不會馬上回收(時間不可預測),如果你現在檢查不能夠發現問題。另外,在某些情況下就算對象被回收
finalize()
可能也不會執行,也就是不能保證檢測出所有問題。

熱點內容
丁度巴拉斯情人電影推薦 發布:2024-08-19 09:13:07 瀏覽:886
類似深水的露點電影 發布:2024-08-19 09:10:12 瀏覽:80
《消失的眼角膜》2電影 發布:2024-08-19 08:34:43 瀏覽:878
私人影院什麼電影好看 發布:2024-08-19 08:33:32 瀏覽:593
干 B 發布:2024-08-19 08:30:21 瀏覽:910
夜晚看片網站 發布:2024-08-19 08:20:59 瀏覽:440
台灣男同電影《越界》 發布:2024-08-19 08:04:35 瀏覽:290
看電影選座位追女孩 發布:2024-08-19 07:54:42 瀏覽:975
日本a級愛情 發布:2024-08-19 07:30:38 瀏覽:832
生活中的瑪麗類似電影 發布:2024-08-19 07:26:46 瀏覽:239