我有一个存储所有坐标(纬度和经度)的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;
}
}
答案 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的示例代码。