2016-03-21 17 views
1

Ich entwickle meinen benutzerdefinierten ContentProvier, um GPS-Koordinaten vom Telefon zu speichern und sie dann mithilfe des SyncAdapter-Frameworks in Android an den Server zu senden.SQLite-Datenbank speichert nur den letzten über ContentProvider gesendeten Datensatz

Was ich bisher gemacht habe, ist die Erstellung des ContentProvider, aber ich habe ein Problem, lassen Sie mich erklären: Jedes Mal, wenn Benutzer seine Position ändern, bekomme ich die Koordinaten und speichern sie. Aber das Problem ist, wenn ich versuche, die SQLite Datenbank Datensätze zu überprüfen, finde ich nur die letzte Position! Es ist, als könnte ich nicht alle Infos speichern, die ich sende.

Hier ist mein Code für die Contentprovider und SQLite-Datenbank:

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; 
    } 

} 

Und das ist die Methode, die ich, wenn der Benutzer bewegt sich nennen:

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); 

    } 

Und ich benutze diese Methode zu zeigen, die Datensätze in der Datenbank:

Antwort

1

Ich denke, es ist, weil Ihr Code nur etwas tut Hing nützlich mit der ersten Reihe.

die Formatierung ändern verrät etwas, was es tatsächlich tut:

// 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()); 

Du bist wahrscheinlich nur ein do fehlt. Versuchen Sie, den Block oben zu ersetzen durch:

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

Dank @Marten, ich konnte mir nicht vorstellen, wie ein einfacher unvorsichtiger Fehler einen Entwickler auf den Kopf stellen kann! –

+0

Wir haben automatische Code-Formatierung mit einem Code-Stil aktiviert, der sicherstellt, dass '{' und '}' immer in einer separaten Zeile stehen. Das macht es einfacher, Probleme wie diese IMO zu erkennen. – Marten

Verwandte Themen