2016-03-21 4 views
1

私はカスタムContentProvierを開発して電話からのGPS座標を保存し、AndroidのSyncAdapterフレームワークを使用してサーバーに送信します。SQLiteデータベースは、ContentProviderを介して送信された最後のレコードのみを保存します

これまでContentProviderを作成していましたが、問題がありました。ユーザーが自分の位置を変更するたびに座標を取得して保存します。 しかし、問題は私が最後の位置を見つけるだけのSQLiteデータベースレコードをチェックしようとするときです!それは私が送るすべての情報を保存することができないようなものです。ここで

はのContentProviderとSQLiteのデータベースのための私のコードです:

package com.sifast.gps.tracking; 

import android.content.ContentProvider; 
import android.content.ContentUris; 
import android.content.ContentValues; 
import android.content.Context; 
import android.content.UriMatcher; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteQueryBuilder; 
import android.net.Uri; 
import android.net.wifi.ScanResult; 
import android.support.annotation.Nullable; 
import android.support.annotation.StringDef; 
import android.text.TextUtils; 

import java.util.HashMap; 

/** 
* Created by ghassen.ati on 18/03/2016. 
*/ 
public class GeoLocProvider extends ContentProvider { 

    static final String PROVIDER_NAME = "com.sifast.gps.tracking.GeoLocProvider"; 
    static final String URL = "content://"+PROVIDER_NAME+"/geoloc"; 
    static final Uri CONTENT_URI = Uri.parse(URL); 

    static final String _ID = "_id"; 
    static final String DATEANDTIME = "dateandtime"; 
    static final String DEVICE_ID = "deviceid"; 
    static final String LONGITUDE = "longitude"; 
    static final String LATITUDE = "latitude"; 

    private static HashMap<String,String> GEOLOC_PROJECTION_MAP; 

    static final int GEOLOC = 1; 
    static final int GEOLOC_ID = 2; 

    static final UriMatcher uriMatcher; 
    static { 
     uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 
     uriMatcher.addURI(PROVIDER_NAME, "geoloc", GEOLOC); 
     uriMatcher.addURI(PROVIDER_NAME, "geoloc/#", GEOLOC_ID); 
    } 

    //Base de données 
    private SQLiteDatabase db; 
    static final String DATABASE_NAME = "GeoLoc"; 
    static final String TABLE_NAME = "geolocstore"; 
    static final int DATABASE_VERSION = 1; 
    static final String CREATE_DB_TABLE = 
      " CREATE TABLE " + TABLE_NAME + 
        " (_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
        " dateandtime TEXT NOT NULL, " + 
        " deviceid INTEGER NOT NULL, " + 
        " longitude INTEGER NOT NULL, " + 
        " latitude INTEGER NOT NULL);"; 

    //Classe Helper 
    private static class DatabaseHelper extends SQLiteOpenHelper { 
     DatabaseHelper(Context context) { 
      super(context,DATABASE_NAME,null,DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db){ 
      db.execSQL(CREATE_DB_TABLE); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ 
      db.execSQL("DROP TABLE IF EXISTS"+TABLE_NAME); 
      onCreate(db); 
     } 
    } 

    @Override 
    public boolean onCreate() { 
     Context context = getContext(); 
     DatabaseHelper dbHelper = new DatabaseHelper(context); 
     db = dbHelper.getWritableDatabase(); 
     return (db==null)? false:true; 
    } 

    @Nullable 
    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
     SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 
     queryBuilder.setTables(TABLE_NAME); 
     switch (uriMatcher.match(uri)) { 
      case GEOLOC: 
       queryBuilder.setProjectionMap(GEOLOC_PROJECTION_MAP); 
       break; 
      case GEOLOC_ID: 
       queryBuilder.appendWhere(_ID+"="+uri.getPathSegments().get(1)); 
       break; 
      default: 
       throw new IllegalArgumentException("URI Inconnue" + uri); 
     } 
     if (sortOrder == null || sortOrder == ""){ 
      sortOrder = DEVICE_ID; 
     } 
     Cursor cursor = queryBuilder.query(db,projection,selection,selectionArgs,null,null,sortOrder); 
     cursor.setNotificationUri(getContext().getContentResolver(), uri); 
     return cursor; 
    } 

    @Nullable 
    @Override 
    public String getType(Uri uri) { 
     switch (uriMatcher.match(uri)){ 
      case GEOLOC: 
       return "vnd.android.cursor.dir/vnd.gps.tracking.geoloc"; 
      case GEOLOC_ID: 
       return "vnd.android.cursor.item/vnd.gps.tracking.geoloc"; 
      default: 
       throw new IllegalArgumentException("URI Inconnue" + uri); 
     } 
    } 

    @Nullable 
    @Override 
    public Uri insert(Uri uri, ContentValues values) { 

     //Ajout d'un enregistrement 
     long rowID = db.insert(TABLE_NAME,"",values); 

     //Si l'ajout est effectué avec succès 
     if (rowID > 0) { 
      Uri _uri = ContentUris.withAppendedId(CONTENT_URI,rowID); 
      getContext().getContentResolver().notifyChange(_uri,null); 
      return _uri; 
     } 
     throw new SQLException("Echec lors de l'ajout d'un enregistrement"+uri); 
    } 

    @Override 
    public int delete(Uri uri, String selection, String[] selectionArgs) { 
     int count = 0; 
     switch (uriMatcher.match(uri)){ 
      case GEOLOC: 
       count = db.delete(TABLE_NAME,selection,selectionArgs); 
       break; 
      case GEOLOC_ID: 
       String id = uri.getPathSegments().get(1); 
       count = db.delete(TABLE_NAME, _ID+" = "+id+(!TextUtils.isEmpty(selection)?" AND ("+selection+')':""),selectionArgs); 
       break; 
      default: 
       throw new IllegalArgumentException("URI Inconnue "+ uri); 
     } 
     getContext().getContentResolver().notifyChange(uri,null); 
     return count; 

    } 

    @Override 
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 
     int count = 0; 
     switch (uriMatcher.match(uri)) { 
      case GEOLOC: 
       count = db.update(TABLE_NAME,values,selection,selectionArgs); 
       break; 
      case GEOLOC_ID: 
       count = db.update(TABLE_NAME,values, _ID + " = " + uri.getPathSegments().get(1) + 
         (!TextUtils.isEmpty(selection) ? " AND (" +selection + ')' : ""), selectionArgs); 
       break; 
      default: 
       throw new IllegalArgumentException("URI Inconnue"+ uri); 
     } 
     getContext().getContentResolver().notifyChange(uri, null); 
     return count; 
    } 

} 

そして、これは私がするたびにユーザーが移動する呼び出すメソッドです:

public void addGeoLocRecord (int uniqueId, Location location) { 

     ContentValues values = new ContentValues(); 

     values.put(GeoLocProvider.DATEANDTIME,getDateTime()); 
     values.put(GeoLocProvider.DEVICE_ID,uniqueId); 
     values.put(GeoLocProvider.LONGITUDE,location.getLongitude()); 
     values.put(GeoLocProvider.LATITUDE,location.getLatitude()); 
     Uri uri = getContentResolver().insert(GeoLocProvider.CONTENT_URI,values); 

    } 

をそして、私は表示するには、このメソッドを使用しますデータベース上のレコード:

public void onClickshowGeoLocRecords (View view){ 
    int count=0; 
    String URL = "content://com.sifast.gps.tracking.GeoLocProvider/geoloc"; 
    Uri geoloc = Uri.parse(URL); 
    Cursor cursor = managedQuery(geoloc,null,null,null,"longitude"); 

    if (cursor.moveToFirst()){ 
     count++; 
     Log.i(TAG,cursor.getString(cursor.getColumnIndex(GeoLocProvider.DATEANDTIME))+ 
       ", "+ cursor.getString(cursor.getColumnIndex(GeoLocProvider.DEVICE_ID))+ 
       ", "+ cursor.getString(cursor.getColumnIndex(GeoLocProvider.LATITUDE))+ 
       ", "+ cursor.getString(cursor.getColumnIndex(GeoLocProvider.LONGITUDE))); 

    }while(cursor.moveToNext()); 
} 

答えて

1

は、私はあなたのコードだけSOMETを行いますので、それはだと思います最初の列に役立つヒンジ。書式設定を変更する

は少しそれが実際に何をするかを明らかにする:

// log the first row if it exists 
if (cursor.moveToFirst()){ 
     count++; 
     Log.i(TAG,cursor.getString(cursor.getColumnIndex(GeoLocProvider.DATEANDTIME))+ 
      ", "+ cursor.getString(cursor.getColumnIndex(GeoLocProvider.DEVICE_ID))+ 
      ", "+ cursor.getString(cursor.getColumnIndex(GeoLocProvider.LATITUDE))+ 
      ", "+ cursor.getString(cursor.getColumnIndex(GeoLocProvider.LONGITUDE))); 

} 

// loop over all remaining rows, doing nothing 
while(cursor.moveToNext()); 

あなたはおそらくdoを逃しています。することにより、上記ブロックを交換してみてください:

if (cursor.moveToFirst()) { 
    do { 
     count++; 
     Log.i(TAG,cursor.getString(cursor.getColumnIndex(GeoLocProvider.DATEANDTIME))+ 
      ", "+ cursor.getString(cursor.getColumnIndex(GeoLocProvider.DEVICE_ID))+ 
      ", "+ cursor.getString(cursor.getColumnIndex(GeoLocProvider.LATITUDE))+ 
      ", "+ cursor.getString(cursor.getColumnIndex(GeoLocProvider.LONGITUDE))); 

    } while(cursor.moveToNext()); 
} 
+0

おかげ@Martenを、私はシンプルなケアレスミスが逆さま開発者の仕事を回すことができるか想像できませんでした! –

+0

'{'と '}'が常に別の行にあることを保証するコードスタイルで自動コード書式を有効にしました。それは、IMOのような問題を見つけるのが簡単です。 – Marten

関連する問題