2011-06-21 7 views
0

Je tente de remplir une carte avec des marqueurs en utilisant lat et long d'une base de données SQLite existante. J'ai trouvé des exemples où vous entrez le lat et long dans le cadre de la méthode mais aucun où il est peuplé à partir de la base de données elle-même. Je suppose que vous utilisez un curseur pour le faire, mais je ne suis pas sûr de savoir comment le faire. J'ai utilisé des curseurs pour peupler ListViews mais je ne peux pas sembler modifier le code pour la superposition de carte.GeoPoints à partir de la base de données SQLite existante

Quelqu'un peut-il me diriger dans la bonne direction ou me diriger vers un tutoriel complet?

Voici mon code jusqu'à présent, comme je suis nouveau à ce que j'ai besoin d'exemples que ne peut pas encore bien construire le code.

LocationMap2.java

import com.google.android.maps.MapView; 

import android.app.Activity; 
import android.content.Context; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.CursorAdapter; 
import android.widget.TextView; 

public class LocationMap2 extends Activity { 

// we use a string to hold the name of our extra, 
// it must include the full package name 
public final static String ID_EXTRA = "com.willows.UKBikeTrails._ID"; 

private AllScotlandHelper dbDataBaseHelper = null; 
private Cursor ourCursor = null; 

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

     // this is our MapView element, obtained by id from our XML Layout 
     MapView mapView = (MapView) findViewById(R.id.mapview); 

     // create our database Helper 
     dbDataBaseHelper = new AllScotlandHelper(this); 
     // we call the create right after initializing the helper, just in 
     // case 
     // they have never run the app before 
     dbDataBaseHelper.createDatabase(); 
     // 
     // open the database!! Our helper now has a SQLiteDatabase database 
     // object 
     dbDataBaseHelper.openDataBase(); 
     // get our cursor. A cursor is a pointer to a dataset, in this case 
     // a set of results from a database query 
     ourCursor = dbDataBaseHelper.getCursor(); 
     // tell android to start managing the cursor 
     // we do this just incase our activity is interrupted or ends, we 
     // want the activity 
     // to close and deactivate the cursor, as needed 
     startManagingCursor(ourCursor); 


    } catch (Exception e) { 

     // this is the line of code that sends a real message to the Log 
     Log.e("ERROR", "ERROR IN CODE: " + e.toString()); 

     // this is the line that prints out the location 
     // the code where the error occurred. 
     e.printStackTrace(); 
    } 

} 



class DataBaseAdapter extends CursorAdapter { 
    DataBaseAdapter(Cursor c) { 
     super(LocationMap2.this, c); 
    } 

    public void bindView(View row, Context ctxt, Cursor c) { 
     DataBaseHolder holder = (DataBaseHolder) row.getTag(); 
     holder.populateFrom(c, dbDataBaseHelper); 
    } 

    @Override 
    public View newView(Context ctxt, Cursor c, ViewGroup parent) { 
     LayoutInflater inflater = getLayoutInflater(); 
     View row = inflater.inflate(R.layout.trail_list, parent, false); 
     DataBaseHolder holder = new DataBaseHolder(row); 
     row.setTag(holder); 
     return (row); 
    } 
} 

static class DataBaseHolder { 
    private TextView name = null; 

    DataBaseHolder(View row) { 
     name = (TextView) row.findViewById(R.id.row); 

    } 

    void populateFrom(Cursor c, AllScotlandHelper r) { 
     name.setText(r.getName(c)); 
    } 

} 

} 

LocationMapHelper:

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Locale; 

import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteQueryBuilder; 
import android.util.Log; 

class LocationMapHelper extends SQLiteOpenHelper { 

//we declare a bunch of useful constants 
//they should be pretty obvious what they are! 
private static final String DATABASE_PATH = "/data/data/com.willows.UKBikeTrails/databases/"; 
private static final String DATABASE_NAME = "ukBikeTrails.db"; 
private static final int SCHEMA_VERSION = 1; 
public static final String TABLE_NAME = "trail_type"; 
public static final String COLUMN_ID = "_id"; 
public static final String COLUMN_TITLE = "TYPE"; 

// BE AWARE - if you make changes to your database using sqlitebrower, you will need to refresh the assets folder in eclipse 
public static final String SECOND_TABLE_NAME = "trail"; 
public static final String SECOND_COLUMN_ID = "_id"; 
public static final String SECOND_COLUMN_TITLE = "NAME"; 

public SQLiteDatabase dbSqlite; 

private final Context myContext; 

public LocationMapHelper (Context context) { 
    super(context, DATABASE_NAME, null, SCHEMA_VERSION); 
    this.myContext = context; 
    // check if exists and copy database from resource 
    //createDB(); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    // check if exists and copy database from resource 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

} 
public void createDatabase() { 
    createDB(); 
} 

private void createDB() { 

    boolean dbExist = DBExists(); 

    if (!dbExist) { 

     //By calling the method we create an empty database into the default system location 
     //We need this so we can overwrite that database with our database 
     this.getReadableDatabase(); 

     //now we copy the database we included! 
     copyDBFromResource(); 

    } 
} 

private boolean DBExists() { 

    SQLiteDatabase db = null; 

    try { 
     String databasePath = DATABASE_PATH + DATABASE_NAME; 
     db = SQLiteDatabase.openDatabase(databasePath, null, 
       SQLiteDatabase.OPEN_READWRITE); 
     db.setLocale(Locale.getDefault()); 
     db.setLockingEnabled(true); 
     db.setVersion(1); 

    } catch (SQLiteException e) { 

     Log.e("SqlHelper", "database not found"); 

    } 

    if (db != null) { 

     db.close(); 

    } 

    return db != null ? true : false; 

} 

private void copyDBFromResource() { 

    InputStream inputStream = null; 
    OutputStream outStream = null; 
    String dbFilePath = DATABASE_PATH + DATABASE_NAME; 

    try { 

     inputStream = myContext.getAssets().open(DATABASE_NAME); 

     outStream = new FileOutputStream(dbFilePath); 

     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = inputStream.read(buffer)) > 0) { 
      outStream.write(buffer, 0, length); 
     } 

     outStream.flush(); 
     outStream.close(); 
     inputStream.close(); 

    } catch (IOException e) { 

     throw new Error ("Problem copying database from resource file."); 
    } 
} 

public void openDataBase() throws SQLException { 

    String myPath = DATABASE_PATH + DATABASE_NAME; 
    dbSqlite = SQLiteDatabase.openDatabase(myPath, null, 
      SQLiteDatabase.OPEN_READWRITE); 
} 

@Override 
public synchronized void close() { 

    if (dbSqlite !=null) 
    { 
     dbSqlite.close(); 
    } 
    super.close(); 
} 

//the following two methods return the column you want and it's title (getName) 
public Cursor getCursor() { 

    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 

    queryBuilder.setTables(TABLE_NAME); 

    String[] asColumnsToReturn = new String[] { COLUMN_ID, COLUMN_TITLE }; 

    //make sure you get your search pass correctly! 
    Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn, null, 
      null, null, null, "_id"); 
    //the name after the nulls dictates how the results are returned. ie in order of "column name" 

    return mCursor; 
} 


public String getName(Cursor c) { 
    return(c.getString(1)); 
    //where 1 refers to COLUMN_TITLE line 11 rows above (0 would be COLUMN_ID and so on) 
} 

public Cursor getLatLong(String id) {  
    String[] args = null; 
    String query = "SELECT _id, LATITUDE,LONGITUDE FROM trail"; 

    return (getReadableDatabase().rawQuery(query, args)); 
} 

MapItemizedOverlay:

import java.util.ArrayList; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.graphics.drawable.Drawable; 
import com.google.android.maps.ItemizedOverlay; 
import com.google.android.maps.OverlayItem; 

public class MapItemizedOverlay extends ItemizedOverlay<OverlayItem> { 
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 
private Context mContext; 

public MapItemizedOverlay(Drawable defaultMarker, Context context) { 
    super(boundCenterBottom(defaultMarker)); 
    mContext = context; 
} 

public void addOverlay(OverlayItem overlay) { 
    mOverlays.add(overlay); 
    populate(); 
} 

@Override 
protected OverlayItem createItem(int i) { 
    return mOverlays.get(i); 
} 

@Override 
public int size() { 
    return mOverlays.size(); 
} 

@Override 
protected boolean onTap(int index) { 
    OverlayItem item = mOverlays.get(index); 
    AlertDialog.Builder dialog = new AlertDialog.Builder(mContext); 
    dialog.setTitle(item.getTitle()); 
    dialog.setMessage(item.getSnippet()); 
    dialog.show(); 
    return true; 
} 
} 

Répondre

2

Vous avez lu vos géopoints de la base de données comme une valeur à long/int, puis instancier GeoPoint objets des numéros et les ajouter à un Overlay.

Cursor c = getContentResolver().query(... some uri ..., new String[]{"lat", "lon"}, null, null, null); 
while (c.moveToNext()) { 
    GeoPoint gp = new GeoPoint(c.getInt(c.getColumnIndex("lat")), c.getInt(c.getColumnIndex("lon"))); 
    .. add to map overlay ... 
} 
+0

J'ai essayé d'ajouter votre réponse à mon code, mais j'ai passé des heures et je n'ai pas réussi à savoir comment l'implémenter. J'ai posté mon code et j'espère avoir de l'aide pour montrer où et comment faire cela. – faarn

Questions connexes