从SQlite DB检索时,标记未在地图中显示

时间:2011-08-20 14:38:16

标签: android sqlite google-maps google-maps-markers

我有一个存储所有坐标(纬度和经度)的SQL DB,并且通过添加标记来检索它们并将它们设置为Map,我正在使用此代码:

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 个答案:

答案 0 :(得分:1)

有许多事情需要改变你的代码,主要是设计而不仅仅是让事情变得有效。首先,我建议您将数据库访问代码分离到一个单独的类中,例如CoordDbAdapter。在这个类中,添加一个内部类CoordDbHelper,它应该扩展SQLiteOpenHelper - 这是你应该进行数据库设置等的地方 - 见here

我对您的代码中出错的初步想法是,您尝试插入坐标,然后打开或创建数据库 - 如果数据库不存在,您将无法尝试检索坐标。

此外,添加一些断点,并确保它在正确的时间做你想做的事。

编辑:您可以将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的类似方法。

答案 1 :(得分:1)

我假设CoordBD扩展SQLiteDatabase。在Android中,您可以直接创建SQLiteDatabase类的实例。而是创建SQLiteOpenHelper的实例(即MaBaseSQLite)并调用getWriteableDatabase。如果需要,Android将处理数据库的创建。

我建议您阅读Android开发指南的这一部分:http://developer.android.com/guide/topics/data/data-storage.html#db。另外,请查看NotePad的示例代码。