2011-08-20 75 views
0

我有一个存储所有坐标(纬度和经度)的SQL DB,并且通过添加标记将它们设置为Map,并使用以下代码:当从SQlite数据库检索时,地图中未显示标记

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

的问题是,没有任何标志showen(创建一个:36.869686,10.315642).I'm相当肯定,检索值时,问题就来了从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; 
    } 
} 

回答

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。

+0

我已经创建了一个扩展SQliteOpenHelper的类。所以我必须删除行'db = openOrCreateDatabase( “coord.bd” ,SQLiteDatabase.CREATE_IF_NECESSARY ,null ); db.setVersion(1); db.setLocale(Locale.getDefault()); db.setLockingEnabled(true);'? – androniennn

+0

请参阅扩展SQLiteOpenHelper的类(编辑后)。 – androniennn

+0

如果我有扩展SQLiteOpenHelper的MaBaseSQLite类,如何在其他类(实现LocationListener的MapActivity类)中打开数据库?谢谢。 – androniennn

1

我假设CoordBD延伸SQLiteDatabase。在Android中,您可以使用而不是直接创建SQLiteDatabase类的实例。相反,创建一个SQLiteOpenHelper(它是MaBaseSQLite)的实例并调用getWriteableDatabase。如果需要的话,Android会处理你的数据库的创建。

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

相关问题