• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.database;
18 
19 /**
20  * A base class for Cursors that store their data in {@link CursorWindow}s.
21  */
22 public abstract class AbstractWindowedCursor extends AbstractCursor
23 {
24     @Override
getBlob(int columnIndex)25     public byte[] getBlob(int columnIndex)
26     {
27         checkPosition();
28 
29         synchronized(mUpdatedRows) {
30             if (isFieldUpdated(columnIndex)) {
31                 return (byte[])getUpdatedField(columnIndex);
32             }
33         }
34 
35         return mWindow.getBlob(mPos, columnIndex);
36     }
37 
38     @Override
getString(int columnIndex)39     public String getString(int columnIndex)
40     {
41         checkPosition();
42 
43         synchronized(mUpdatedRows) {
44             if (isFieldUpdated(columnIndex)) {
45                 return (String)getUpdatedField(columnIndex);
46             }
47         }
48 
49         return mWindow.getString(mPos, columnIndex);
50     }
51 
52     @Override
copyStringToBuffer(int columnIndex, CharArrayBuffer buffer)53     public void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer)
54     {
55         checkPosition();
56 
57         synchronized(mUpdatedRows) {
58             if (isFieldUpdated(columnIndex)) {
59                 super.copyStringToBuffer(columnIndex, buffer);
60             }
61         }
62 
63         mWindow.copyStringToBuffer(mPos, columnIndex, buffer);
64     }
65 
66     @Override
getShort(int columnIndex)67     public short getShort(int columnIndex)
68     {
69         checkPosition();
70 
71         synchronized(mUpdatedRows) {
72             if (isFieldUpdated(columnIndex)) {
73                 Number value = (Number)getUpdatedField(columnIndex);
74                 return value.shortValue();
75             }
76         }
77 
78         return mWindow.getShort(mPos, columnIndex);
79     }
80 
81     @Override
getInt(int columnIndex)82     public int getInt(int columnIndex)
83     {
84         checkPosition();
85 
86         synchronized(mUpdatedRows) {
87             if (isFieldUpdated(columnIndex)) {
88                 Number value = (Number)getUpdatedField(columnIndex);
89                 return value.intValue();
90             }
91         }
92 
93         return mWindow.getInt(mPos, columnIndex);
94     }
95 
96     @Override
getLong(int columnIndex)97     public long getLong(int columnIndex)
98     {
99         checkPosition();
100 
101         synchronized(mUpdatedRows) {
102             if (isFieldUpdated(columnIndex)) {
103                 Number value = (Number)getUpdatedField(columnIndex);
104                 return value.longValue();
105             }
106         }
107 
108         return mWindow.getLong(mPos, columnIndex);
109     }
110 
111     @Override
getFloat(int columnIndex)112     public float getFloat(int columnIndex)
113     {
114         checkPosition();
115 
116         synchronized(mUpdatedRows) {
117             if (isFieldUpdated(columnIndex)) {
118                 Number value = (Number)getUpdatedField(columnIndex);
119                 return value.floatValue();
120             }
121         }
122 
123         return mWindow.getFloat(mPos, columnIndex);
124     }
125 
126     @Override
getDouble(int columnIndex)127     public double getDouble(int columnIndex)
128     {
129         checkPosition();
130 
131         synchronized(mUpdatedRows) {
132             if (isFieldUpdated(columnIndex)) {
133                 Number value = (Number)getUpdatedField(columnIndex);
134                 return value.doubleValue();
135             }
136         }
137 
138         return mWindow.getDouble(mPos, columnIndex);
139     }
140 
141     @Override
isNull(int columnIndex)142     public boolean isNull(int columnIndex)
143     {
144         checkPosition();
145 
146         synchronized(mUpdatedRows) {
147             if (isFieldUpdated(columnIndex)) {
148                 return getUpdatedField(columnIndex) == null;
149             }
150         }
151 
152         return mWindow.isNull(mPos, columnIndex);
153     }
154 
isBlob(int columnIndex)155     public boolean isBlob(int columnIndex)
156     {
157         checkPosition();
158 
159         synchronized(mUpdatedRows) {
160             if (isFieldUpdated(columnIndex)) {
161                 Object object = getUpdatedField(columnIndex);
162                 return object == null || object instanceof byte[];
163             }
164         }
165 
166         return mWindow.isBlob(mPos, columnIndex);
167     }
168 
isString(int columnIndex)169     public boolean isString(int columnIndex)
170     {
171         checkPosition();
172 
173         synchronized(mUpdatedRows) {
174             if (isFieldUpdated(columnIndex)) {
175                 Object object = getUpdatedField(columnIndex);
176                 return object == null || object instanceof String;
177             }
178         }
179 
180         return mWindow.isString(mPos, columnIndex);
181     }
182 
isLong(int columnIndex)183     public boolean isLong(int columnIndex)
184     {
185         checkPosition();
186 
187         synchronized(mUpdatedRows) {
188             if (isFieldUpdated(columnIndex)) {
189                 Object object = getUpdatedField(columnIndex);
190                 return object != null && (object instanceof Integer || object instanceof Long);
191             }
192         }
193 
194         return mWindow.isLong(mPos, columnIndex);
195     }
196 
isFloat(int columnIndex)197     public boolean isFloat(int columnIndex)
198     {
199         checkPosition();
200 
201         synchronized(mUpdatedRows) {
202             if (isFieldUpdated(columnIndex)) {
203                 Object object = getUpdatedField(columnIndex);
204                 return object != null && (object instanceof Float || object instanceof Double);
205             }
206         }
207 
208         return mWindow.isFloat(mPos, columnIndex);
209     }
210 
211     @Override
checkPosition()212     protected void checkPosition()
213     {
214         super.checkPosition();
215 
216         if (mWindow == null) {
217             throw new StaleDataException("Access closed cursor");
218         }
219     }
220 
221     @Override
getWindow()222     public CursorWindow getWindow() {
223         return mWindow;
224     }
225 
226     /**
227      * Set a new cursor window to cursor, usually set a remote cursor window
228      * @param window cursor window
229      */
setWindow(CursorWindow window)230     public void setWindow(CursorWindow window) {
231         if (mWindow != null) {
232             mWindow.close();
233         }
234         mWindow = window;
235     }
236 
hasWindow()237     public boolean hasWindow() {
238         return mWindow != null;
239     }
240 
241     /**
242      * This needs be updated in {@link #onMove} by subclasses, and
243      * needs to be set to NULL when the contents of the cursor change.
244      */
245     protected CursorWindow mWindow;
246 }
247