我已经创建了一个表单,用户应填写一些信息然后存储位置,为此将打开一个对话框,从google地图中选择位置,然后将维护操作保存在数据库中。 这是我的表格 enter image description here
我的Java文件:
public class MapsActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor> {
GoogleMap googleMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Getting Google Play availability status
GoogleApiAvailability api = GoogleApiAvailability.getInstance();
int status = api.isGooglePlayServicesAvailable(this);
// Showing status
if(status!=ConnectionResult.SUCCESS){ // Google Play Services are not available
Toast.makeText(this, api.getErrorString(status), Toast.LENGTH_LONG).show();
}else { // Google Play Services are available
// Getting reference to the SupportMapFragment of activity_main.xml
SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
// Getting GoogleMap object from the fragment
MapFragment mapFragment = (MapFragment) getFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync((OnMapReadyCallback) this);
// Enabling MyLocation Layer of Google Map
googleMap.setMyLocationEnabled(true);
// Invoke LoaderCallbacks to retrieve and draw already saved locations in map
LoaderManager.getInstance(this).initLoader(0, null, this).forceLoad();
}
googleMap.setOnMapClickListener(new OnMapClickListener() {
@Override
public void onMapClick(LatLng point) {
// Drawing marker on the map
drawMarker(point);
// Creating an instance of ContentValues
ContentValues contentValues = new ContentValues();
// Setting latitude in ContentValues
contentValues.put(DatabaseHelper.COL_6, point.latitude );
// Setting longitude in ContentValues
contentValues.put(DatabaseHelper.COL_7, point.longitude);
// Setting zoom in ContentValues
contentValues.put(DatabaseHelper.COL_8, googleMap.getCameraPosition().zoom);
// Creating an instance of LocationInsertTask
LocationInsertTask insertTask = new LocationInsertTask();
// Storing the latitude, longitude and zoom level to SQLite database
insertTask.execute(contentValues);
Toast.makeText(getBaseContext(), "Marker is added to the Map", Toast.LENGTH_SHORT).show();
}
});
googleMap.setOnMapLongClickListener(new OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng point) {
// Removing all markers from the Google Map
googleMap.clear();
// Creating an instance of LocationDeleteTask
LocationDeleteTask deleteTask = new LocationDeleteTask();
// Deleting all the rows from SQLite database table
deleteTask.execute();
Toast.makeText(getBaseContext(), "All markers are removed", Toast.LENGTH_LONG).show();
}
});
}
private void drawMarker(LatLng point){
// Creating an instance of MarkerOptions
MarkerOptions markerOptions = new MarkerOptions();
// Setting latitude and longitude for the marker
markerOptions.position(point);
// Adding marker on the Google Map
googleMap.addMarker(markerOptions);
}
private class LocationInsertTask extends AsyncTask<ContentValues, Void, Void>{
@Override
protected Void doInBackground(ContentValues... contentValues) {
/** Setting up values to insert the clicked location into SQLite database */
getContentResolver().insert(LocationsContentProvider.CONTENT_URI, contentValues[0]);
return null;
}
}
private class LocationDeleteTask extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
/** Deleting all the locations stored in SQLite database */
getContentResolver().delete(LocationsContentProvider.CONTENT_URI, null, null);
return null;
}
}
@Override
public Loader<Cursor> onCreateLoader(int arg0,
Bundle arg1) {
// Uri to the content provider LocationsContentProvider
Uri uri = LocationsContentProvider.CONTENT_URI;
// Fetches all the rows from locations table
return new CursorLoader(this, uri, null, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader,
Cursor data) {
int locationCount = 0;
double lat=0;
double lng=0;
float zoom=0;
// Number of locations available in the SQLite database table
locationCount = data.getCount();
// Move the current record pointer to the first row of the table
data.moveToFirst();
for(int i=0;i<locationCount;i++){
// Get the latitude
lat = data.getDouble(data.getColumnIndex(DatabaseHelper.COL_6));
// Get the longitude
lng = data.getDouble(data.getColumnIndex(DatabaseHelper.COL_7));
// Get the zoom level
zoom = data.getFloat(data.getColumnIndex(DatabaseHelper.COL_8));
// Creating an instance of LatLng to plot the location in Google Maps
LatLng location = new LatLng(lat, lng);
// Drawing the marker in the Google Maps
drawMarker(location);
// Traverse the pointer to the next row
data.moveToNext();
}
if(locationCount>0){
// Moving CameraPosition to last clicked position
googleMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(lat,lng)));
// Setting the zoom level in the map on last position is clicked
googleMap.animateCamera(CameraUpdateFactory.zoomTo(zoom));
}
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
// TODO Auto-generated method stub
}
}
the content provider:
/** A custom Content Provider to do the database operations */
public class LocationsContentProvider extends ContentProvider{
public static final String PROVIDER_NAME = "in.wptrafficanalyzer.locationmarkersqlite.locations";
/** A uri to do operations on locations table. A content provider is identified by its uri */
public static final Uri CONTENT_URI = Uri.parse("content://" + PROVIDER_NAME + "/locations" );
/** Constant to identify the requested operation */
private static final int LOCATIONS = 1;
private static final UriMatcher uriMatcher ;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(PROVIDER_NAME, "locations", LOCATIONS);
}
/** This content provider does the database operations by this object */
DatabaseHelper mLocationsDB;
/** A callback method which is invoked when the content provider is starting up */
@Override
public boolean onCreate() {
mLocationsDB = new DatabaseHelper(getContext());
return true;
}
/** A callback method which is invoked when insert operation is requested on this content provider */
@Override
public Uri insert(Uri uri, ContentValues values) {
long rowID = mLocationsDB.insert(values);
Uri _uri=null;
if(rowID>0){
_uri = ContentUris.withAppendedId(CONTENT_URI, rowID);
}else {
try {
throw new SQLException("Failed to insert : " + uri);
} catch (SQLException e) {
e.printStackTrace();
}
}
return _uri;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
/** A callback method which is invoked by default content uri */
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
if(uriMatcher.match(uri)==LOCATIONS){
return mLocationsDB.getAllLocations();
}
return null;
}
@Override
public String getType(Uri uri) {
return null;
}
}
the database helper:
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "Maintenance.db";
public static final String TABLE_NAME = "Maintenance_table";
public static final String COL_1 = "ID";
public static final String COL_2 = "AGENT";
public static final String COL_3 = "PROB";
public static final String COL_4 = "DATE";
public static final String COL_5 = "COMMENT";
public static final String COL_6 = "LAT";
public static final String COL_7 = "LNG";
public static final String COL_8 = "ZOM";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + TABLE_NAME +" (ID INTEGER PRIMARY KEY AUTOINCREMENT,AGENT TEXT,PROB TEXT,COMMENT TEXT,DATE INTEGER,LNG DOUBLE, LAT DOUBLE, ZOM TEXT )");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
onCreate(db);
}
public boolean insertData(String agent,String date,String comment,String prob) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_2,agent);
contentValues.put(COL_3,prob);
contentValues.put(COL_4,date);
contentValues.put(COL_5,comment);
long result = db.insert(TABLE_NAME,null ,contentValues);
if(result == -1)
return false;
else
return true;
}
/** Inserts a new location to the table locations */
public long insert(ContentValues contentValues){
SQLiteDatabase db = this.getWritableDatabase();
long rowID = db.insert(TABLE_NAME, null, contentValues);
return rowID;
}
public Cursor getAllData() {
SQLiteDatabase db = this.getWritableDatabase();
Cursor res = db.rawQuery("select * from "+TABLE_NAME,null);
return res;
}
/** Returns all the locations from the table */
public Cursor getAllLocations(){
SQLiteDatabase db = this.getWritableDatabase();
return db.query(TABLE_NAME, new String[] { COL_1, COL_6 , COL_7, COL_8 } , null, null, null, null, null);
}
public boolean updateData(String id,String agent,String date,String comment,String prob) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_2,agent);
contentValues.put(COL_3,prob);
contentValues.put(COL_4,date);
contentValues.put(COL_5,comment);
db.update(TABLE_NAME, contentValues, "ID = ?",new String[] { id });
return true;
}
public Integer deleteData (String id) {
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(TABLE_NAME, "ID = ?",new String[] {id});
}
public int del(){
SQLiteDatabase db = this.getWritableDatabase();
int cnt = db.delete(TABLE_NAME, null , null);
return cnt;
}
}
错误:
2019-12-14 13:04:19.248 11348-11348/com.example.maintainit
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.maintainit, PID: 11348
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.maintainit/com.example.maintainit.Maps}: java.lang.ClassCastException: com.example.maintainit.Maps cannot be cast to com.google.android.gms.maps.OnMapReadyCallback
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2724)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6251)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
Caused by: java.lang.ClassCastException: com.example.maintainit.Maps cannot be cast to com.google.android.gms.maps.OnMapReadyCallback
at com.example.maintainit.Maps.onCreate(Maps.java:61)
at android.app.Activity.performCreate(Activity.java:6696)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2677)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6251)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
任何帮助将不胜感激