187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen/* 287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * Copyright (C) 2007 The Android Open Source Project 387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * 487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License"); 587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * you may not use this file except in compliance with the License. 687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * You may obtain a copy of the License at 787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * 887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * http://www.apache.org/licenses/LICENSE-2.0 987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * 1087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * Unless required by applicable law or agreed to in writing, software 1187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS, 1287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * See the License for the specific language governing permissions and 1487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * limitations under the License. 1587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen */ 1687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 1787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissenpackage com.android.music; 1887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 1987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissenimport android.database.AbstractCursor; 2087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissenimport android.database.Cursor; 2187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissenimport android.database.DataSetObserver; 2287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissenimport android.util.Log; 2387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 2487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen/** 2587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * A variant of MergeCursor that sorts the cursors being merged. If decent 2687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * performance is ever obtained, it can be put back under android.database. 2787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen */ 2887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissenpublic class SortCursor extends AbstractCursor 2987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen{ 3087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen private static final String TAG = "SortCursor"; 3187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen private Cursor mCursor; // updated in onMove 3287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen private Cursor[] mCursors; 3387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen private int [] mSortColumns; 3487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen private final int ROWCACHESIZE = 64; 3587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen private int mRowNumCache[] = new int[ROWCACHESIZE]; 3687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen private int mCursorCache[] = new int[ROWCACHESIZE]; 3787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen private int mCurRowNumCache[][]; 3887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen private int mLastCacheHit = -1; 3987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 4087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen private DataSetObserver mObserver = new DataSetObserver() { 4187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 4287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 4387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public void onChanged() { 4487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen // Reset our position so the optimizations in move-related code 4587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen // don't screw us over 4687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mPos = -1; 4787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 4887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 4987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 5087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public void onInvalidated() { 5187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mPos = -1; 5287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 5387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen }; 5487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 5587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public SortCursor(Cursor[] cursors, String sortcolumn) 5687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen { 5787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursors = cursors; 5887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 5987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen int length = mCursors.length; 6087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mSortColumns = new int[length]; 6187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen for (int i = 0 ; i < length ; i++) { 6287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursors[i] == null) continue; 6387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 6487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen // Register ourself as a data set observer 6587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursors[i].registerDataSetObserver(mObserver); 6687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 6787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursors[i].moveToFirst(); 6887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 6987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen // We don't catch the exception 7087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mSortColumns[i] = mCursors[i].getColumnIndexOrThrow(sortcolumn); 7187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 7287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursor = null; 7387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen String smallest = ""; 7487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen for (int j = 0 ; j < length; j++) { 7587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursors[j] == null || mCursors[j].isAfterLast()) 7687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen continue; 7787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen String current = mCursors[j].getString(mSortColumns[j]); 7887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursor == null || current.compareToIgnoreCase(smallest) < 0) { 7987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen smallest = current; 8087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursor = mCursors[j]; 8187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 8287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 8387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 8487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen for (int i = mRowNumCache.length - 1; i >= 0; i--) { 8587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mRowNumCache[i] = -2; 8687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 8787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCurRowNumCache = new int[ROWCACHESIZE][length]; 8887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 8987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 9087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 9187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public int getCount() 9287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen { 9387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen int count = 0; 9487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen int length = mCursors.length; 9587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen for (int i = 0 ; i < length ; i++) { 9687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursors[i] != null) { 9787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen count += mCursors[i].getCount(); 9887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 9987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 10087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return count; 10187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 10287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 10387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 10487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public boolean onMove(int oldPosition, int newPosition) 10587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen { 10687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (oldPosition == newPosition) 10787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return true; 10887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 10987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen /* Find the right cursor 11087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * Because the client of this cursor (the listadapter/view) tends 11187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * to jump around in the cursor somewhat, a simple cache strategy 11287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * is used to avoid having to search all cursors from the start. 11387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * TODO: investigate strategies for optimizing random access and 11487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen * reverse-order access. 11587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen */ 11687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 11787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen int cache_entry = newPosition % ROWCACHESIZE; 11887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 11987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mRowNumCache[cache_entry] == newPosition) { 12087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen int which = mCursorCache[cache_entry]; 12187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursor = mCursors[which]; 12287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursor == null) { 12387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen Log.w(TAG, "onMove: cache results in a null cursor."); 12487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return false; 12587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 12687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursor.moveToPosition(mCurRowNumCache[cache_entry][which]); 12787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mLastCacheHit = cache_entry; 12887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return true; 12987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 13087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 13187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursor = null; 13287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen int length = mCursors.length; 13387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 13487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mLastCacheHit >= 0) { 13587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen for (int i = 0; i < length; i++) { 13687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursors[i] == null) continue; 13787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursors[i].moveToPosition(mCurRowNumCache[mLastCacheHit][i]); 13887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 13987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 14087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 14187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (newPosition < oldPosition || oldPosition == -1) { 14287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen for (int i = 0 ; i < length; i++) { 14387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursors[i] == null) continue; 14487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursors[i].moveToFirst(); 14587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 14687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen oldPosition = 0; 14787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 14887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (oldPosition < 0) { 14987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen oldPosition = 0; 15087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 15187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 15287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen // search forward to the new position 15387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen int smallestIdx = -1; 15487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen for(int i = oldPosition; i <= newPosition; i++) { 15587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen String smallest = ""; 15687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen smallestIdx = -1; 15787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen for (int j = 0 ; j < length; j++) { 15887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursors[j] == null || mCursors[j].isAfterLast()) { 15987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen continue; 16087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 16187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen String current = mCursors[j].getString(mSortColumns[j]); 16287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (smallestIdx < 0 || current.compareToIgnoreCase(smallest) < 0) { 16387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen smallest = current; 16487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen smallestIdx = j; 16587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 16687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 16787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (i == newPosition) break; 16887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursors[smallestIdx] != null) { 16987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursors[smallestIdx].moveToNext(); 17087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 17187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 17287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursor = mCursors[smallestIdx]; 17387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mRowNumCache[cache_entry] = newPosition; 17487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursorCache[cache_entry] = smallestIdx; 17587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen for (int i = 0; i < length; i++) { 17687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursors[i] != null) { 17787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCurRowNumCache[cache_entry][i] = mCursors[i].getPosition(); 17887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 17987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 18087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mLastCacheHit = -1; 18187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return true; 18287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 18387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 18487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 18587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public String getString(int column) 18687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen { 18787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return mCursor.getString(column); 18887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 18987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 19087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 19187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public short getShort(int column) 19287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen { 19387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return mCursor.getShort(column); 19487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 19587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 19687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 19787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public int getInt(int column) 19887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen { 19987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return mCursor.getInt(column); 20087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 20187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 20287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 20387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public long getLong(int column) 20487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen { 20587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return mCursor.getLong(column); 20687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 20787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 20887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 20987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public float getFloat(int column) 21087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen { 21187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return mCursor.getFloat(column); 21287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 21387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 21487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 21587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public double getDouble(int column) 21687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen { 21787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return mCursor.getDouble(column); 21887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 21987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 22087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 221f591aa9ff2bd356b31da1c531d1bde46f9f79f03Vasu Nori public int getType(int column) { 222f591aa9ff2bd356b31da1c531d1bde46f9f79f03Vasu Nori return mCursor.getType(column); 223f591aa9ff2bd356b31da1c531d1bde46f9f79f03Vasu Nori } 224f591aa9ff2bd356b31da1c531d1bde46f9f79f03Vasu Nori 225f591aa9ff2bd356b31da1c531d1bde46f9f79f03Vasu Nori @Override 22687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public boolean isNull(int column) 22787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen { 22887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return mCursor.isNull(column); 22987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 23087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 23187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 23287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public byte[] getBlob(int column) 23387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen { 23487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return mCursor.getBlob(column); 23587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 23687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 23787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 23887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public String[] getColumnNames() 23987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen { 24087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursor != null) { 24187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return mCursor.getColumnNames(); 24287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } else { 24387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen // All of the cursors may be empty, but they can still return 24487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen // this information. 24587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen int length = mCursors.length; 24687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen for (int i = 0 ; i < length ; i++) { 24787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursors[i] != null) { 24887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return mCursors[i].getColumnNames(); 24987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 25087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 25187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen throw new IllegalStateException("No cursor that can return names"); 25287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 25387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 25487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 25587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 25687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public void deactivate() 25787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen { 25887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen int length = mCursors.length; 25987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen for (int i = 0 ; i < length ; i++) { 26087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursors[i] == null) continue; 26187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursors[i].deactivate(); 26287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 26387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 26487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 26587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 26687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public void close() { 26787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen int length = mCursors.length; 26887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen for (int i = 0 ; i < length ; i++) { 26987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursors[i] == null) continue; 27087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursors[i].close(); 27187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 27287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 27387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 27487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 27587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public void registerDataSetObserver(DataSetObserver observer) { 27687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen int length = mCursors.length; 27787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen for (int i = 0 ; i < length ; i++) { 27887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursors[i] != null) { 27987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursors[i].registerDataSetObserver(observer); 28087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 28187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 28287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 28387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 28487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 28587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public void unregisterDataSetObserver(DataSetObserver observer) { 28687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen int length = mCursors.length; 28787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen for (int i = 0 ; i < length ; i++) { 28887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursors[i] != null) { 28987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen mCursors[i].unregisterDataSetObserver(observer); 29087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 29187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 29287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 29387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 29487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen @Override 29587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen public boolean requery() 29687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen { 29787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen int length = mCursors.length; 29887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen for (int i = 0 ; i < length ; i++) { 29987bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursors[i] == null) continue; 30087bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 30187bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen if (mCursors[i].requery() == false) { 30287bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return false; 30387bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 30487bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 30587bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen 30687bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen return true; 30787bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen } 30887bbf3c40cd044c3daa9fad28fb94e8570fcae05Marco Nelissen} 309