You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							190 lines
						
					
					
						
							6.7 KiB
						
					
					
				
			
		
		
	
	
							190 lines
						
					
					
						
							6.7 KiB
						
					
					
				| /*
 | |
|  * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  *        http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  */
 | |
| 
 | |
| package net.micode.notes.gtask.data;
 | |
| 
 | |
| import android.content.ContentResolver;
 | |
| import android.content.ContentUris;
 | |
| import android.content.ContentValues;
 | |
| import android.content.Context;
 | |
| import android.database.Cursor;
 | |
| import android.net.Uri;
 | |
| import android.util.Log;
 | |
| 
 | |
| import net.micode.notes.data.Notes;
 | |
| import net.micode.notes.data.Notes.DataColumns;
 | |
| import net.micode.notes.data.Notes.DataConstants;
 | |
| import net.micode.notes.data.Notes.NoteColumns;
 | |
| import net.micode.notes.data.NotesDatabaseHelper.TABLE;
 | |
| import net.micode.notes.gtask.exception.ActionFailureException;
 | |
| 
 | |
| import org.json.JSONException;
 | |
| import org.json.JSONObject;
 | |
| 
 | |
| 
 | |
| public class SqlData {
 | |
|     private static final String TAG = SqlData.class.getSimpleName();
 | |
| 
 | |
|     private static final int INVALID_ID = -99999;
 | |
| 
 | |
|     public static final String[] PROJECTION_DATA = new String[] {
 | |
|             DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1,
 | |
|             DataColumns.DATA3
 | |
|     };
 | |
| 
 | |
|     public static final int DATA_ID_COLUMN = 0;
 | |
| 
 | |
|     public static final int DATA_MIME_TYPE_COLUMN = 1;
 | |
| 
 | |
|     public static final int DATA_CONTENT_COLUMN = 2;
 | |
| 
 | |
|     public static final int DATA_CONTENT_DATA_1_COLUMN = 3;
 | |
| 
 | |
|     public static final int DATA_CONTENT_DATA_3_COLUMN = 4;
 | |
| 
 | |
|     private ContentResolver mContentResolver;
 | |
| 
 | |
|     private boolean mIsCreate;
 | |
| 
 | |
|     private long mDataId;
 | |
| 
 | |
|     private String mDataMimeType;
 | |
| 
 | |
|     private String mDataContent;
 | |
| 
 | |
|     private long mDataContentData1;
 | |
| 
 | |
|     private String mDataContentData3;
 | |
| 
 | |
|     private ContentValues mDiffDataValues;
 | |
| 
 | |
|     public SqlData(Context context) {
 | |
|         mContentResolver = context.getContentResolver();
 | |
|         mIsCreate = true;
 | |
|         mDataId = INVALID_ID;
 | |
|         mDataMimeType = DataConstants.NOTE;
 | |
|         mDataContent = "";
 | |
|         mDataContentData1 = 0;
 | |
|         mDataContentData3 = "";
 | |
|         mDiffDataValues = new ContentValues();
 | |
|     }
 | |
| 
 | |
|     public SqlData(Context context, Cursor c) {
 | |
|         mContentResolver = context.getContentResolver();
 | |
|         mIsCreate = false;
 | |
|         loadFromCursor(c);
 | |
|         mDiffDataValues = new ContentValues();
 | |
|     }
 | |
| 
 | |
|     private void loadFromCursor(Cursor c) {
 | |
|         mDataId = c.getLong(DATA_ID_COLUMN);
 | |
|         mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN);
 | |
|         mDataContent = c.getString(DATA_CONTENT_COLUMN);
 | |
|         mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN);
 | |
|         mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN);
 | |
|     }
 | |
| 
 | |
|     public void setContent(JSONObject js) throws JSONException {
 | |
|         long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID;
 | |
|         if (mIsCreate || mDataId != dataId) {
 | |
|             mDiffDataValues.put(DataColumns.ID, dataId);
 | |
|         }
 | |
|         mDataId = dataId;
 | |
| 
 | |
|         String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE)
 | |
|                 : DataConstants.NOTE;
 | |
|         if (mIsCreate || !mDataMimeType.equals(dataMimeType)) {
 | |
|             mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType);
 | |
|         }
 | |
|         mDataMimeType = dataMimeType;
 | |
| 
 | |
|         String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : "";
 | |
|         if (mIsCreate || !mDataContent.equals(dataContent)) {
 | |
|             mDiffDataValues.put(DataColumns.CONTENT, dataContent);
 | |
|         }
 | |
|         mDataContent = dataContent;
 | |
| 
 | |
|         long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0;
 | |
|         if (mIsCreate || mDataContentData1 != dataContentData1) {
 | |
|             mDiffDataValues.put(DataColumns.DATA1, dataContentData1);
 | |
|         }
 | |
|         mDataContentData1 = dataContentData1;
 | |
| 
 | |
|         String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : "";
 | |
|         if (mIsCreate || !mDataContentData3.equals(dataContentData3)) {
 | |
|             mDiffDataValues.put(DataColumns.DATA3, dataContentData3);
 | |
|         }
 | |
|         mDataContentData3 = dataContentData3;
 | |
|     }
 | |
| 
 | |
|     public JSONObject getContent() throws JSONException {
 | |
|         if (mIsCreate) {
 | |
|             Log.e(TAG, "it seems that we haven't created this in database yet");
 | |
|             return null;
 | |
|         }
 | |
|         JSONObject js = new JSONObject();
 | |
|         js.put(DataColumns.ID, mDataId);
 | |
|         js.put(DataColumns.MIME_TYPE, mDataMimeType);
 | |
|         js.put(DataColumns.CONTENT, mDataContent);
 | |
|         js.put(DataColumns.DATA1, mDataContentData1);
 | |
|         js.put(DataColumns.DATA3, mDataContentData3);
 | |
|         return js;
 | |
|     }
 | |
| 
 | |
|     public void commit(long noteId, boolean validateVersion, long version) {
 | |
| 
 | |
|         if (mIsCreate) {
 | |
|             if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) {
 | |
|                 mDiffDataValues.remove(DataColumns.ID);
 | |
|             }
 | |
| 
 | |
|             mDiffDataValues.put(DataColumns.NOTE_ID, noteId);
 | |
|             Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues);
 | |
|             try {
 | |
|                 mDataId = Long.valueOf(uri.getPathSegments().get(1));
 | |
|             } catch (NumberFormatException e) {
 | |
|                 Log.e(TAG, "Get note id error :" + e.toString());
 | |
|                 throw new ActionFailureException("create note failed");
 | |
|             }
 | |
|         } else {
 | |
|             if (mDiffDataValues.size() > 0) {
 | |
|                 int result = 0;
 | |
|                 if (!validateVersion) {
 | |
|                     result = mContentResolver.update(ContentUris.withAppendedId(
 | |
|                             Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null);
 | |
|                 } else {
 | |
|                     result = mContentResolver.update(ContentUris.withAppendedId(
 | |
|                             Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues,
 | |
|                             " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE
 | |
|                                     + " WHERE " + NoteColumns.VERSION + "=?)", new String[] {
 | |
|                                     String.valueOf(noteId), String.valueOf(version)
 | |
|                             });
 | |
|                 }
 | |
|                 if (result == 0) {
 | |
|                     Log.w(TAG, "there is no update. maybe user updates note when syncing");
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         mDiffDataValues.clear();
 | |
|         mIsCreate = false;
 | |
|     }
 | |
| 
 | |
|     public long getId() {
 | |
|         return mDataId;
 | |
|     }
 | |
| }
 |