package com.emop.client.provider; import java.util.ArrayList; import java.util.Iterator; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.content.ContentResolver; import android.database.CharArrayBuffer; import android.database.ContentObserver; import android.database.Cursor; import android.database.DataSetObserver; import android.net.Uri; import android.os.Bundle; import android.util.Log; public class JSONCursor implements Cursor { public static final Cursor EMPTY = new JSONCursor(new JSONArray(), new String[]{}); private JSONArray data = null; private JSONObject curObj = null; private int curIndex = 0; private ArrayList<String> keys = new ArrayList<String>(); private boolean isClosed = false; public JSONCursor(JSONArray data, String[] keys){ this.data = data; if(data.length() > 0){ try { curObj = data.getJSONObject(0); for(String k: keys){ this.keys.add(k); } if(curObj.has("id")){ this.keys.add("id"); } //this.keys = keys; } catch (JSONException e) { Log.w("emop", "error:" + e.toString(), e); } } } @Override public void close() { isClosed = true; } @Override public void copyStringToBuffer(int arg0, CharArrayBuffer arg1) { // TODO Auto-generated method stub } @Override public void deactivate() { // TODO Auto-generated method stub } @Override public byte[] getBlob(int arg0) { // TODO Auto-generated method stub return null; } @Override public int getColumnCount() { return keys.size(); } @Override public int getColumnIndex(String name) { if(name.equals("_id")){ name = "id"; } if(curObj.has(name)){ return keys.indexOf(name); }else if(name.equals("id")){ return 0; }else { return -1; } } @Override public int getColumnIndexOrThrow(String arg0) throws IllegalArgumentException { // TODO Auto-generated method stub return 0; } @Override public String getColumnName(int index) { return keys.get(index); } @Override public String[] getColumnNames() { return keys.toArray(new String[]{}); } @Override public int getCount() { return data.length(); } @Override public double getDouble(int index) { try{ index = index == 0 ? 1 : index; return curObj.getDouble(keys.get(index)); }catch(Exception e){ Log.w("emop", "error:" + e.toString() + ", index:" + index, e); } return 0; } @Override public Bundle getExtras() { // TODO Auto-generated method stub return null; } @Override public float getFloat(int index) { return (float)getDouble(index); } @Override public int getInt(int index) { return (int)getLong(index); } @Override public long getLong(int index) { try{ if(index == 0){ index = this.getColumnIndex("_id"); } return curObj.getLong(keys.get(index)); }catch(Exception e){ Log.w("emop", "error:" + e.toString() + ", index:" + index +".\n obj:" + curObj.toString(), e); } return 0; } @Override public int getPosition() { return curIndex; } @Override public short getShort(int index) { return (short)getLong(index); } @Override public String getString(int index) { try{ index = index == 0 ? 1 : index; return curObj.getString(keys.get(index)); }catch(Exception e){ Log.w("emop", "error:" + e.toString() + ", index:" + index, e); } return null; } @Override public boolean getWantsAllOnMoveCalls() { return false; } @Override public boolean isAfterLast() { return curIndex > data.length(); } @Override public boolean isBeforeFirst() { return curIndex < 0; } @Override public boolean isClosed() { return isClosed; } @Override public boolean isFirst() { return curIndex == 0; } @Override public boolean isLast() { return curIndex == data.length() - 1; } @Override public boolean isNull(int arg0) { return false; } @Override public boolean move(int index) { return moveToPosition(curIndex + index); } @Override public boolean moveToFirst() { return moveToPosition(0); } @Override public boolean moveToLast() { return moveToPosition(data.length() - 1); } @Override public boolean moveToNext() { return moveToPosition(curIndex + 1); } @Override public boolean moveToPosition(int index) { if(index < 0 || index >= data.length()){ return false; } this.curIndex = index; try{ curObj = data.getJSONObject(index); }catch(Exception e){ Log.w("emop", "move to position error:" + index, e); } return true; } @Override public boolean moveToPrevious() { return moveToPosition(curIndex - 1); } @Override public void registerContentObserver(ContentObserver arg0) { } @Override public void registerDataSetObserver(DataSetObserver arg0) { } @Override public boolean requery() { return false; } @Override public Bundle respond(Bundle arg0) { return null; } @Override public void setNotificationUri(ContentResolver arg0, Uri arg1) { // TODO Auto-generated method stub } @Override public void unregisterContentObserver(ContentObserver arg0) { // TODO Auto-generated method stub } @Override public void unregisterDataSetObserver(DataSetObserver arg0) { // TODO Auto-generated method stub } }