Маркер не отображается на карте при извлечении из SQlite DB - PullRequest
0 голосов
/ 20 августа 2011

У меня есть база данных SQL, в которой хранятся все координаты (широта и долгота), для их восстановления и установки их на карту путем добавления маркера, я использую этот код:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.geo);

        CoordBD CoordBd = new CoordBD(this);
        Coordo coordo = new Coordo(36.869686,10.315642 );
        CoordBd.open();
        CoordBd.insertCoordo(coordo);


        maMap = (MapView)findViewById(R.id.myGmap);
        maMap.setBuiltInZoomControls(true);
        ItemizedOverlayPerso pinOverlay = new ItemizedOverlayPerso(getResources().getDrawable(R.drawable.marker));

        db = openOrCreateDatabase(
            "coord.bd"
            , SQLiteDatabase.CREATE_IF_NECESSARY
            , null
            );
        db.setVersion(1);
        db.setLocale(Locale.getDefault());
        db.setLockingEnabled(true);




        String[] result_columns = new String[] {COL_LATI, COL_LONGI};
        Cursor cur = db.query(true, TABLE_COORD, result_columns,
        null, null, null, null, null, null);
        cur.moveToFirst();
        while (cur.isAfterLast() == false) {
                int latitude = cur.getColumnIndex("latitude");
                int longitude = cur.getColumnIndex("longitude");
                GeoPoint point = new GeoPoint(microdegrees(latitude),microdegrees(longitude));
                pinOverlay.addPoint(point);
            cur.moveToNext();
        }
        cur.close();





        maMap.getOverlays().add(pinOverlay);
        monControler = maMap.getController();
        monControler.setZoom(12);

Проблема в том, что есть какой-либо показанный маркер (созданный: 36.869686,10.315642). Я почти уверен, что проблема исходит из базы данных SQlite при получении значений. Есть идеи / исправления? Спасибо.

public class MaBaseSQLite extends SQLiteOpenHelper {

    private static final String TABLE_COORD = "table_coordonnées";
    private static final String COL_ID = "ID";
    private static final String COL_LATI = "Latitude";
    private static final String COL_LONGI = "Longitude";

    private static final String CREATE_BDD = "CREATE TABLE " + TABLE_COORD + " ("
    + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_LATI + " TEXT NOT NULL, "
    + COL_LONGI + " TEXT NOT NULL);";

    public MaBaseSQLite(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //on créé la table à partir de la requête écrite dans la variable CREATE_BDD
        db.execSQL(CREATE_BDD);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //On peut fait ce qu'on veut ici moi j'ai décidé de supprimer la table et de la recréer
        //comme ça lorsque je change la version les id repartent de 0
        db.execSQL("DROP TABLE " + TABLE_COORD + ";");
        onCreate(db);
    }

}

CoordBD класс:

public class CoordBD {

    private static final int VERSION_BDD = 1;
    private static final String NOM_BDD = "coord.bd";

    private static final String TABLE_COORD = "table_coordonnées";
    private static final String COL_ID = "ID";
    private static final int NUM_COL_ID = 0;
    private static final String COL_LATI = "Latitude";
    private static final int NUM_COL_LATI = 1;
    private static final String COL_LONGI = "Longitude";
    private static final int NUM_COL_LONGI = 2;

    private SQLiteDatabase bdd;

    private MaBaseSQLite maBaseSQLite;

    public CoordBD(Context context){
        //On créer la BDD et sa table
        maBaseSQLite = new MaBaseSQLite(context, NOM_BDD, null, VERSION_BDD);
    }

    public void open(){
        //on ouvre la BDD en écriture
        bdd = maBaseSQLite.getWritableDatabase();
    }

    public void close(){
        //on ferme l'accès à la BDD
        bdd.close();
    }

    public SQLiteDatabase getBDD(){
        return bdd;
    }

    public long insertCoordo(Coordo coordo){
        //Création d'un ContentValues (fonctionne comme une HashMap)
        ContentValues values = new ContentValues();
        //on lui ajoute une valeur associé à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
        values.put(COL_LATI, coordo.getlati());
        values.put(COL_LONGI, coordo.getlongi());
        //on insère l'objet dans la BDD via le ContentValues
        return bdd.insert(TABLE_COORD, null, values);
    }

    public int updateCoordo(int id, Coordo coordo){
        //La mise à jour d'un livre dans la BDD fonctionne plus ou moins comme une insertion
        //il faut simple préciser quelle livre on doit mettre à jour grâce à l'ID
        ContentValues values = new ContentValues();
        values.put(COL_LATI, coordo.getlati());
        values.put(COL_LONGI, coordo.getlongi());
        return bdd.update(TABLE_COORD, values, COL_ID + " = " +id, null);
    }

    public int removeCoordoWithID(int id){
        //Suppression d'un livre de la BDD grâce à l'ID
        return bdd.delete(TABLE_COORD, COL_ID + " = " +id, null);
    }

    public Coordo getCoordoWithLati(String lati){
        //Récupère dans un Cursor les valeur correspondant à une coordonnée contenu dans la BDD (ici on sélectionne le livre grâce à son titre)
        Cursor c = bdd.query(TABLE_COORD, new String[] {COL_ID, COL_LATI, COL_LONGI}, COL_LONGI + " LIKE \"" + lati +"\"", null, null, null, null);
        return cursorToCoordo(c);
    }

    //Cette méthode permet de convertir un cursor en un latitude/longitude
    private Coordo cursorToCoordo(Cursor c){
        //si aucun élément n'a été retourné dans la requête, on renvoie null
        if (c.getCount() == 0)
            return null;

        //Sinon on se place sur le premier élément
        c.moveToFirst();
        //On créé une cordonnée
        Coordo coordo = new Coordo();
        //on lui affecte toutes les infos grâce aux infos contenues dans le Cursor
        coordo.setId(c.getInt(NUM_COL_ID));
        coordo.setlati(c.getDouble(NUM_COL_LATI));
        coordo.setlongi(c.getDouble(NUM_COL_LONGI));
        //On ferme le cursor
        c.close();

        //On retourne la coordonnée
        return coordo;
    }
}

Ответы [ 2 ]

1 голос
/ 20 августа 2011

Я предполагаю, что CoordBD расширяет SQLiteDatabase.В Android вы не напрямую создаете экземпляры классов SQLiteDatabase.Вместо этого создайте экземпляр вашего SQLiteOpenHelper (который является MaBaseSQLite) и вызовите getWriteableDatabase.Android будет обрабатывать создание вашей базы данных в случае необходимости.

Я предлагаю прочитать этот раздел руководства разработчика Android: http://developer.android.com/guide/topics/data/data-storage.html#db.Также посмотрите на пример кода для Блокнот .

1 голос
/ 20 августа 2011

Есть ряд вещей, которые можно изменить в вашем коде, в первую очередь с дизайном, а не просто заставить что-то работать. Во-первых, я бы предложил разделить код доступа к базе данных на отдельный класс, например CoordDbAdapter. В этом классе добавьте внутренний класс CoordDbHelper, который должен расширять SQLiteOpenHelper - здесь вы должны выполнить настройку базы данных и т. Д. - см. здесь

Мои первоначальные мысли о том, что не так в вашем коде, состоит в том, что вы пытаетесь вставить координаты, а затем вы открываете или создаете базу данных - если база данных не существует, у вас возникнут проблемы при попытке получить координаты. *

Кроме того, добавьте несколько точек останова и убедитесь, что он делает то, что вы хотите в нужное время.

РЕДАКТИРОВАТЬ: Возможно, вы могли бы изменить свой метод open () на что-то вроде этого:

public CoordBD open() throws SQLException
{
    try
    {
        dbb = dbHelper.getWritableDatabase();
    }
    catch (SQLiteException ex)
    {
        dbb = dbHelper.getReadableDatabase();
    }

    return this;
}

Итак, в своей деятельности вам просто нужно поставить:

coordBD.open();
coordBD.insertCoord(Coord coord);
coordBD.close();

И похожий способ получить Coord.

...