Android 如何将标记从SQLite数据库输出到MapView和Google地图
我已经设置了我的代码,所以当用户移动到地图片段时,它会显示一个包含数据库中所有标记的地图。我有两个虚拟标记,它们可以工作,但我数据库中的W标记不显示 我已经确保SQL查询是正确的,并尝试添加静态标记,但动态标记不会出现Android 如何将标记从SQLite数据库输出到MapView和Google地图,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,我已经设置了我的代码,所以当用户移动到地图片段时,它会显示一个包含数据库中所有标记的地图。我有两个虚拟标记,它们可以工作,但我数据库中的W标记不显示 我已经确保SQL查询是正确的,并尝试添加静态标记,但动态标记不会出现 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { V
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.map,container,false);
mapView = (MapView) rootView.findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
Log.i("DEBUG", "onMapReady");
map = googleMap;
LatLng sydney = new LatLng(-34, 151);
LatLng paris = new LatLng(12,-40);
map.addMarker(new
MarkerOptions().position(sydney).title("Marker in Sydney"));
map.addMarker(new
MarkerOptions().position(paris).title("Marker in Ocean"));
try {
String sql = "SELECT
marker.markerLat,marker.markerLon,marker.markerDate
FROM marker LEFT JOIN tripMarker ON" +
" marker.markerID = tripMarker.markerID LEFT
JOIN userTrip ON userTrip.tripID =
tripMarker.tripID " +
"WHERE userTrip.userID = '" + User.UserLoggedOn
+ "';";
Cursor cursor = db.rawQuery(sql, null);
if ( cursor.moveToFirst() ) {
while (cursor.moveToNext()) {
double lat =
cursor.getDouble(cursor.getColumnIndex("markerLat"));
System.out.println(lat);
double lon =
cursor.getDouble(cursor.getColumnIndex("markerLon"));
System.out.println(lon);
LatLng latLng = new LatLng(lat, lon);
MarkerOptions markerOptions = new
MarkerOptions();
markerOptions.position(latLng);
map.addMarker(markerOptions.title(cursor.getString(
cursor.getColumnIndex("markerDate"))));
}
}
}catch (Exception e){
e.printStackTrace();
}
}
});
return rootView;
}
这是我的XML片段
<com.google.android.gms.maps.MapView
android:id="@+id/mapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
是否应该跳过第一行?这是唯一会返回的行吗 可能是日志记录无法按照注释工作的原因:- 出于某种原因,我在if语句和 抓住了,但我好像找不到。这是不是意味着他们两个都没有 扳机 也许您应该尝试(删除将跳过第一行的
if(csr.moveToFirst())
),方法是:-
MarkerOptions().position(paris).title("Marker in Ocean"));
try {
String sql = "SELECT
marker.markerLat,marker.markerLon,marker.markerDate
FROM marker LEFT JOIN tripMarker ON" +
" marker.markerID = tripMarker.markerID LEFT
JOIN userTrip ON userTrip.tripID =
tripMarker.tripID " +
"WHERE userTrip.userID = '" + User.UserLoggedOn
+ "';";
Cursor cursor = db.rawQuery(sql, null);
while (cursor.moveToNext()) {
double lat =
cursor.getDouble(cursor.getColumnIndex("markerLat"));
System.out.println(lat);
double lon =
cursor.getDouble(cursor.getColumnIndex("markerLon"));
System.out.println(lon);
LatLng latLng = new LatLng(lat, lon);
MarkerOptions markerOptions = new
MarkerOptions();
markerOptions.position(latLng);
map.addMarker(markerOptions.title(cursor.getString(
cursor.getColumnIndex("markerDate"))));
}
}catch (Exception e){
e.printStackTrace();
}
我也不想将代码包装在try/catch子句中,因为您可能隐藏了问题。您是否检查了查询是否返回了一些结果或返回了null。将日志放入if条件中,如果数据库中有满足上面所写查询的数据,请检查此项,并将log放入catch以确保try中没有任何中断block@akhilchoudhary出于某种原因,我将日志放在if语句和catch中,但似乎找不到它们。这是否意味着它们都不会触发?@coder188642这意味着查询返回null,这就是为什么它没有输入if条件。检查sql查询,并确保有一些数据与查询条件匹配。@akhilchoudhary rawQuery或查询将返回空光标。光标可能为空,在这种情况下,count方法将返回0。空游标非常典型,而且非常有用。我已经完成了您所说的,我认为它们现在的问题是游标返回null,因为while循环中现在有一个日志,并且它没有被触发。我查看了SQL查询,尽管我相当确定它的correctCursor永远不会为null,rawQuery将始终返回实例化的游标,除非它是CRSAH。光标可能为空。您可以添加Log.d(“COUNT”,String.valueOf(csr.getCount())+“rows extracted”);在获取游标后立即。在“Cursor Cursor=db.rawQuery(sql,null);”行上添加断点也很有用然后使用运行/调试应用程序(Shift+F9或绿色小错误图标,而不是绿色右箭头)。当它停止时,请查看sql变量。WHERE子句是否合理,即单引号中的值是否与您期望的用户ID相同。也可以尝试使用no WHERE子句,例如
String sql=“SELECT marker.markerLat,marker.markerLon,marker.markerDate FROM marker LEFT JOIN tripMarker ON”+“marker.markerID=tripMarker.markerID在userTrip.tripID=tripMarker.tripID限制3上左加入userTrip;“;
(添加的限制不会显示太多标记)。如果这起作用,那么问题在于WHERE子句。我想我已经解决了。我的SQL语句是错误的。User.UserLoggedOn返回的是用户用户名而不是ID。它现在起作用了。