2014-02-23 48 views
1

我正在嘗試從預先創建的SQLite數據庫中讀取位置(經度,緯度)值和標題。我得到的問題是,它似乎在地圖上顯示標記,但與數據庫中的值無關 - 這幾乎就像他們正在讀取不正確。從SQLite數據庫爲Google地圖標記讀取值

我MonumentsDatabase.java類(其中我處理數據庫):

public class MonumentsDatabase extends SQLiteOpenHelper { 
public static String DATABASE_NAME = "antiquityDatabase.db"; 
public final static String DATABASE_PATH = "/data/data/com.example.antiquity/databases/"; 
private static final int DATABASE_VERSION = 1; 
int _id; 
double _lat; 
double _lng; 

String _title; 
String _date; 
String _description; 

String[] _idColumn = {"_id"}; 
String[] latColumn = {"latitude"}; 
String[] lngColumn = {"longitude"}; 
String[] titleColumn = {"title"}; 
String[] dateColumn = {"date"}; 
String[] descColumn = {"description"}; 


private SQLiteDatabase database; 
private final Context myContext; 

public MonumentsDatabase(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    this.myContext = context; 
} 

public void createDatabase() throws IOException { 
    boolean databaseExist = checkDatabase(); 

    if(databaseExist) { 
     //Do nothing 
    } else { 
     this.getReadableDatabase(); 

     try { 
      copyDatabase(); 

     } catch (IOException e) { 
      throw new Error("Error copying database"); 
     } 
    } 
} 

private boolean checkDatabase() { 
    SQLiteDatabase checkDatabase = null; 

    try { 
     String myPath = DATABASE_PATH + DATABASE_NAME; 
     checkDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
    } catch (SQLiteException e) { 
     //database doesnt exist yet 
    } 

    if(checkDatabase != null) { 
     checkDatabase.close(); 
    } 

    return checkDatabase != null ? true : false; 
} 

private void copyDatabase() throws IOException { 

    InputStream myInput = myContext.getAssets().open(DATABASE_NAME); 

    String outputFilename = DATABASE_PATH + DATABASE_NAME; 

    OutputStream myOutput = new FileOutputStream(outputFilename); 

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

    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 
} 

public void openDatabase() throws SQLException { 

    String myPath = DATABASE_PATH + DATABASE_NAME; 
    database = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
} 

@Override 
public synchronized void close() { 
    if(database != null) { 
     database.close(); 
    } 
    super.close(); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 

} 

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

} 

public int getID() { 
    Cursor idQuery = database.query("monuments", _idColumn, null, null, null, null, null); 
    if (idQuery.moveToFirst()) { 
     do { 
      StringBuilder sb = new StringBuilder(); 
      int columnsQty = idQuery.getColumnCount(); 
      for (int idx=0; idx<columnsQty; ++idx) { 
       sb.append(idQuery.getString(idx)); 
       if (idx < columnsQty - 1) 
        sb.append("; "); 
      } 
      Log.v("getID() - ID", String.format("Row: %d, Values: %s", idQuery.getPosition(), sb.toString())); 

     } 
     while (idQuery.moveToNext()); 
    } 
    return _id; 
} 

public void setID(int id) { 
    _id = id; 
} 

public double getLat() { 
    Cursor latQuery = database.query("monuments", latColumn, null, null, null, null, null); 

    latQuery.moveToFirst(); 
    if (latQuery.moveToFirst()) { 
     do { 
      StringBuilder sb = new StringBuilder(); 
      int columnsQty = latQuery.getColumnCount(); 
      for (int idx=0; idx<columnsQty; ++idx) { 
       sb.append(latQuery.getString(idx)); 
       if (idx < columnsQty - 1) 
        sb.append("; "); 
      } 
      Log.v("getLat() - LATITUDE", String.format("Row: %d, Values: %s", latQuery.getPosition(), sb.toString())); 

     } 
     while (latQuery.moveToNext()); 


    }  
    return _lat; 
} 

public void setLat(double lat) { 
    _lat = lat; 
} 

public double getLng() { 
    Cursor lngQuery = database.query("monuments", lngColumn, null, null, null, null, null); 

    if (lngQuery.moveToFirst()) { 
     do { 
      StringBuilder sb = new StringBuilder(); 
      int columnsQty = lngQuery.getColumnCount(); 
      for (int idx=0; idx<columnsQty; ++idx) { 
       sb.append(lngQuery.getString(idx)); 
       if (idx < columnsQty - 1) 
        sb.append("; "); 
      } 
      Log.v("getLng() - LONGITUDE", String.format("Row: %d, Values: %s", lngQuery.getPosition(), sb.toString())); 

     } 
     while (lngQuery.moveToNext()); 
    } 
    return _lng; 
} 

public void setLng(double lng) { 
    _lng = lng; 
} 
// Handle the monuments titles 
public String getTitle() { 
    Cursor titleQuery = database.query("monuments", titleColumn, null, null, null, null, null); 

    if (titleQuery.moveToFirst()) { 
     do { 
      StringBuilder sb = new StringBuilder(); 
      int columnsQty = titleQuery.getColumnCount(); 
      for (int idx=0; idx<columnsQty; ++idx) { 
       sb.append(titleQuery.getString(idx)); 
       if (idx < columnsQty - 1) 
        sb.append("; "); 
      } 
      Log.v("getTitle() - TITLE", String.format("Row: %d, Values: %s", titleQuery.getPosition(), sb.toString())); 

     } 
     while (titleQuery.moveToNext()); 
    } 
    return _title; 
} 

public void setTitle(String title) { 
    _title = title; 
} 

public String getDate() { 
    Cursor dateQuery = database.query("monuments", dateColumn, null, null, null, null, null, null); 
    if (dateQuery.moveToFirst()) { 
     do { 
      StringBuilder sb = new StringBuilder(); 
      int columnsQty = dateQuery.getColumnCount(); 
      for (int idx=0; idx<columnsQty; ++idx) { 
       sb.append(dateQuery.getString(idx)); 
       if (idx < columnsQty - 1) 
        sb.append("; "); 
      } 
      Log.v("getDate() - DATE", String.format("Row: %d, Values: %s", dateQuery.getPosition(), sb.toString())); 

     } 
     while (dateQuery.moveToNext()); 
    } 
    return _date; 
} 

public void setDate(String date) { 

    _date = date; 
} 

public String getDescription() { 
    Cursor descriptionQuery = database.query("monuments", descColumn, null, null, null, null, null, null); 
    if (descriptionQuery.moveToFirst()) { 
     do { 
      StringBuilder sb = new StringBuilder(); 
      int columnsQty = descriptionQuery.getColumnCount(); 
      for (int idx=0; idx<columnsQty; ++idx) { 
       sb.append(descriptionQuery.getString(idx)); 
       if (idx < columnsQty - 1) 
        sb.append("; "); 
      } 
      Log.v("getDescription() - DESCRIPTION", String.format("Row: %d, Values: %s", descriptionQuery.getPosition(), sb.toString())); 

     } 
     while (descriptionQuery.moveToNext()); 

    } 
    return _description; 
} 

public void setDescription(String description) { 
    _description = description; 
} 

public void addMarker(MarkerObject m) { 
    m.getTitle(); 

} 

public ArrayList<MonumentsDatabase> arrayDB() { 
    ArrayList<MonumentsDatabase> aD = new ArrayList<MonumentsDatabase>(); 
    //aD.add(getTitle()); 

    return aD; 
} 

}

我MainActivity.java類:

public class MainActivity extends FragmentActivity { 

private GoogleMap map; 
Intent data;  
MonumentsDatabase monDatabase; 
ArrayList<MonumentsDatabase> mDatabase; 
int _id; 
double _lat; 
double _lng; 
double sLat; 
double sLng; 
String _title; 
String titles; 
double lats; 
double lngs; 
LatLng markerPosition; 
int i; 
private Marker bigBen; 
private Marker mainMarker; 
private Marker parliamentSQ; 
private Marker parliament; 
private Marker random; 


static final LatLng PARLIAMENT = new LatLng(51.499776600000000000, -0.125173099999983600); 
//static final LatLng MARKERS = new LatLng(getLatitude(), getLongitude()); 
static final LatLng PARLIAMENTSQ = new LatLng(51.5006, -0.1267); 
static final LatLng RANDOM = new LatLng(51.5019, -0.1257); 
LocationManager locationManager; 
Context context = this; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    map=((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 

    map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { 
     @Override 
     public void onInfoWindowClick(Marker marker) { 
      Intent data = new Intent(MainActivity.this, DisplayData.class); 
      startActivity(data); 

     } 
    }); 

    ArrayList<MonumentsDatabase> mDB = createDatabase(); 


    for(i = 0; i < mDB.size(); i++) { 
     //Get position of what the DB is and get the latitude and longitude 
     sLat = mDB.get(i).getLat(); 
     sLng = mDB.get(i).getLng(); 
     markerPosition = new LatLng(sLat, sLng); 
     map.addMarker(new MarkerOptions() 
      .position(markerPosition) 
      .title(mDB.get(i).getTitle()) 
      .snippet("Click for more info.") 
      .icon(BitmapDescriptorFactory.fromResource(R.drawable.custom_marker))); 
    } 





    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

    if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
     disabledGPS(); 
    }  

    map.setMyLocationEnabled(true); 
} 




private void disabledGPS() { 
    final AlertDialog.Builder gpsDisabled = new AlertDialog.Builder(this); 
    gpsDisabled.setMessage("This app requires GPS to be enabled. Do you wish to continue?") 
     .setCancelable(false) 
     .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS)); 
      } 
     }) 
     .setNegativeButton("No", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       dialog.cancel(); 
      } 
     }); 
    AlertDialog mainAlert = gpsDisabled.create(); 
    mainAlert.show(); 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

public ArrayList<MonumentsDatabase> createDatabase() { 
    monDatabase = new MonumentsDatabase(this); 
    try { 
     monDatabase.createDatabase(); 
    } catch (IOException ioe) { 
     throw new Error("Unable to create database"); 
    } 
    try { 
     monDatabase.openDatabase(); 
    }catch(SQLException sqle){ 
     throw sqle; 
    } 

    mDatabase = new ArrayList<MonumentsDatabase>(); 
    monDatabase.setTitle(titles); 
    monDatabase.setLat(lats); 
    monDatabase.setLng(lngs); 
    titles = monDatabase.getTitle(); 
    lats = monDatabase.getLat(); 
    lngs = monDatabase.getLng(); 
    mDatabase.add(monDatabase); 

    return mDatabase; 
} 

}

我想要什麼發生的是標題,緯度和經度值讀取並顯示爲Google上的標記地圖,SQLite數據庫中目前有20條記錄。

任何幫助非常感謝!

編輯:

登錄貓打印出數據,所以:

02-24 12:55:11.691: V/getTitle() - TITLE(18411): Row: 0, Values: Big Ben 
02-24 12:55:11.692: V/getTitle() - TITLE(18411): Row: 1, Values: Swansea Castle 
02-24 12:55:11.693: V/getTitle() - TITLE(18411): Row: 2, Values: Cardiff Castle 
02-24 12:55:11.694: V/getTitle() - TITLE(18411): Row: 3, Values: Mumbles Lighthouse 
02-24 12:55:11.695: V/getTitle() - TITLE(18411): Row: 4, Values: Sketty Hall 
02-24 12:55:11.695: V/getTitle() - TITLE(18411): Row: 5, Values: St Mary's Church, Swansea 
02-24 12:55:11.696: V/getTitle() - TITLE(18411): Row: 6, Values: Loughor 
02-24 12:55:11.696: V/getTitle() - TITLE(18411): Row: 7, Values: Oystermouth Castle 
02-24 12:55:11.696: V/getTitle() - TITLE(18411): Row: 8, Values: Oxwich Castle 
02-24 12:55:11.696: V/getTitle() - TITLE(18411): Row: 9, Values: Penlle'r Castell 
02-24 12:55:11.696: V/getTitle() - TITLE(18411): Row: 10, Values: Pennard Castle 
02-24 12:55:11.698: V/getTitle() - TITLE(18411): Row: 11, Values: The Palace Theatre 
02-24 12:55:11.699: V/getTitle() - TITLE(18411): Row: 12, Values: Morris Castle 
02-24 12:55:11.699: V/getTitle() - TITLE(18411): Row: 13, Values: Castle Cinema 
02-24 12:55:11.699: V/getTitle() - TITLE(18411): Row: 14, Values: Port Eynon 
02-24 12:55:11.700: V/getTitle() - TITLE(18411): Row: 15, Values: Penrice Castle 
02-24 12:55:11.700: V/getTitle() - TITLE(18411): Row: 16, Values: Weobley Castle 
02-24 12:55:11.700: V/getTitle() - TITLE(18411): Row: 17, Values: St Fagans Castle 
02-24 12:55:11.700: V/getTitle() - TITLE(18411): Row: 18, Values: Gregynog Hall 
02-24 12:55:11.700: V/getTitle() - TITLE(18411): Row: 19, Values: Margam Castle 
02-24 12:55:11.702: V/getLat() - LATITUDE(18411): Row: 0, Values: 51.5008 
02-24 12:55:11.703: V/getLat() - LATITUDE(18411): Row: 1, Values: 51.6203 
02-24 12:55:11.703: V/getLat() - LATITUDE(18411): Row: 2, Values: 51.4824 
02-24 12:55:11.703: V/getLat() - LATITUDE(18411): Row: 3, Values: 51.5671 
02-24 12:55:11.703: V/getLat() - LATITUDE(18411): Row: 4, Values: 51.6131 
02-24 12:55:11.704: V/getLat() - LATITUDE(18411): Row: 5, Values: 51.619 
02-24 12:55:11.704: V/getLat() - LATITUDE(18411): Row: 6, Values: 51.6626 
02-24 12:55:11.704: V/getLat() - LATITUDE(18411): Row: 7, Values: 51.5765 
02-24 12:55:11.704: V/getLat() - LATITUDE(18411): Row: 8, Values: 51.5546 
02-24 12:55:11.705: V/getLat() - LATITUDE(18411): Row: 9, Values: 51.7691 
02-24 12:55:11.705: V/getLat() - LATITUDE(18411): Row: 10, Values: 51.5766 
02-24 12:55:11.705: V/getLat() - LATITUDE(18411): Row: 11, Values: 51.3739 
02-24 12:55:11.705: V/getLat() - LATITUDE(18411): Row: 12, Values: 51.391 
02-24 12:55:11.705: V/getLat() - LATITUDE(18411): Row: 13, Values: 51.3715 
02-24 12:55:11.706: V/getLat() - LATITUDE(18411): Row: 14, Values: 51.5453 
02-24 12:55:11.706: V/getLat() - LATITUDE(18411): Row: 15, Values: 51.5752 
02-24 12:55:11.706: V/getLat() - LATITUDE(18411): Row: 16, Values: 51.6128 
02-24 12:55:11.706: V/getLat() - LATITUDE(18411): Row: 17, Values: 51.4859 
02-24 12:55:11.707: V/getLat() - LATITUDE(18411): Row: 18, Values: 52.3403 
02-24 12:55:11.707: V/getLat() - LATITUDE(18411): Row: 19, Values: 51.5628 
02-24 12:58:56.017: V/getLng() - LONGITUDE(18567): Row: 0, Values: -0.1247 
02-24 12:58:56.018: V/getLng() - LONGITUDE(18567): Row: 1, Values: 3.9412 
02-24 12:58:56.018: V/getLng() - LONGITUDE(18567): Row: 2, Values: 3.1811 
02-24 12:58:56.018: V/getLng() - LONGITUDE(18567): Row: 3, Values: 3.9723 
02-24 12:58:56.018: V/getLng() - LONGITUDE(18567): Row: 4, Values: 3.9883 
02-24 12:58:56.020: V/getLng() - LONGITUDE(18567): Row: 5, Values: 3.943 
02-24 12:58:56.020: V/getLng() - LONGITUDE(18567): Row: 6, Values: 4.06461 
02-24 12:58:56.020: V/getLng() - LONGITUDE(18567): Row: 7, Values: 4.00297 
02-24 12:58:56.020: V/getLng() - LONGITUDE(18567): Row: 8, Values: 4.16791 
02-24 12:58:56.021: V/getLng() - LONGITUDE(18567): Row: 9, Values: 3.9356 
02-24 12:58:56.024: V/getLng() - LONGITUDE(18567): Row: 10, Values: 4.1023 
02-24 12:58:56.025: V/getLng() - LONGITUDE(18567): Row: 11, Values: 3.5628 
02-24 12:58:56.026: V/getLng() - LONGITUDE(18567): Row: 12, Values: 3.562 
02-24 12:58:56.027: V/getLng() - LONGITUDE(18567): Row: 13, Values: 3.5629 
02-24 12:58:56.027: V/getLng() - LONGITUDE(18567): Row: 14, Values: 4.215 
02-24 12:58:56.027: V/getLng() - LONGITUDE(18567): Row: 15, Values: 4.1703 
02-24 12:58:56.027: V/getLng() - LONGITUDE(18567): Row: 16, Values: 4.1994 
02-24 12:58:56.028: V/getLng() - LONGITUDE(18567): Row: 17, Values: 3.2677 
02-24 12:58:56.028: V/getLng() - LONGITUDE(18567): Row: 18, Values: 3.2108 
02-24 12:58:56.029: V/getLng() - LONGITUDE(18567): Row: 19, Values: 3.7254 
+1

能否請您登錄**板條的值**和** ** SLNG和後作爲更新到您的文章,所以我們可能會看到,如果值正在被正確檢索。 – rogcg

+0

當然!它的更新與輸出:) –

+0

我只能看到緯度,你可以把這個粘貼在'mDB.get(i).getLng()'行:'Log.i(「MainActivity」,「Latitude and Longitude」 + sLat +「 - 」+ sLng);'併發布新日誌。 – rogcg

回答

1

的發生緯度和經度不被檢索,因爲方法getLat()getLng()正在從光標錯誤地檢索它。

既然你選擇從數據庫中只有一列,你必須得到列索引0,而不是1或2,你在做內部getLat()getLng()方法。

裏面那些方法,這樣做:

// getLat() method 
_lat = latQuery.getDouble(0); 

// getLng() method 
_lng = lngQuery.getDouble(0); 
1

也許我失去了一些東西,但它看起來像你的getLat()方法實際上並不設置_lat的價值(這是什麼它返回)在任何地方?類似的getLong()等。

如果這不是問題,你有沒有嘗試過調試和步進代碼?這應該會讓你更好地瞭解達芙價值從何而來。

對不起,我會添加此作爲註釋,但沒有足夠的代表。

+0

我現在就來看看,我發送了數據庫通過日誌和打印出來罰款,所以也許這就是爲什麼! –

0

保留數據元組 - 拉特,lng,描述等的區別是什麼?我把它變成一個表3列(削減簡潔的其餘部分):

Latitude | Longitude | Description 
11.11 | 11.11  | Place A 
22.22 | 22.22  | place B 

在這種情況下,你永遠不會得到像11,11; 22.22; place B一個紀錄,什麼顯然是在您的情況

相關問題