Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将标记从SQLite数据库输出到MapView和Google地图_Android_Sqlite_Android Sqlite - Fatal编程技术网

Android 如何将标记从SQLite数据库输出到MapView和Google地图

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

我已经设置了我的代码,所以当用户移动到地图片段时,它会显示一个包含数据库中所有标记的地图。我有两个虚拟标记,它们可以工作,但我数据库中的W标记不显示

我已经确保SQL查询是正确的,并尝试添加静态标记,但动态标记不会出现

@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。它现在起作用了。