Java 如何在使用SQLite的Google Maps Marker API上给出名称和不同的图像?

Java 如何在使用SQLite的Google Maps Marker API上给出名称和不同的图像?,java,android,sqlite,google-maps,google-maps-markers,Java,Android,Sqlite,Google Maps,Google Maps Markers,当他们想在Google Maps marker上提供不同的名称和不同的标记图像时,我遇到了困难,我使用SQLite数据库存储来自标记的数据,我的项目中的以下代码: MaBase.java MainActivity.java 然后我会在地图形式的其他布局上调用不同的标记,但是如何在布局中输入数据以显示插入数据库的标记?以下布局将与标记地图一起输入: fragment_maps.xml 请帮忙,谢谢:) 长猫 02-12 02:15:33.851:E/AndroidRuntime(2489):致命异

当他们想在Google Maps marker上提供不同的名称和不同的标记图像时,我遇到了困难,我使用SQLite数据库存储来自标记的数据,我的项目中的以下代码:

MaBase.java MainActivity.java 然后我会在地图形式的其他布局上调用不同的标记,但是如何在布局中输入数据以显示插入数据库的标记?以下布局将与标记地图一起输入:

fragment_maps.xml 请帮忙,谢谢:)

长猫
02-12 02:15:33.851:E/AndroidRuntime(2489):致命异常:main
02-12 02:15:33.851:E/AndroidRuntime(2489):java.lang.RuntimeException:编译时无法启动活动组件信息{com.bongkorr/com.bongkorr.maps.MainActivity}:android.database.sqlite.SQLiteException:未知数据库marquer(代码1):,正在编译:CREATE TABLE marquer.db(ID整数主键自动递增,经度文本不为空,纬度文本不为空);
02-12 02:15:33.851:E/AndroidRuntime(2489):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
02-12 02:15:33.851:E/AndroidRuntime(2489):位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
02-12 02:15:33.851:E/AndroidRuntime(2489):在android.app.ActivityThread.access$600(ActivityThread.java:141)
02-12 02:15:33.851:E/AndroidRuntime(2489):位于android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
02-12 02:15:33.851:E/AndroidRuntime(2489):位于android.os.Handler.dispatchMessage(Handler.java:99)
02-12 02:15:33.851:E/AndroidRuntime(2489):在android.os.Looper.loop(Looper.java:137)
02-12 02:15:33.851:E/AndroidRuntime(2489):位于android.app.ActivityThread.main(ActivityThread.java:5041)
02-12 02:15:33.851:E/AndroidRuntime(2489):位于java.lang.reflect.Method.Invokenactive(本机方法)
02-12 02:15:33.851:E/AndroidRuntime(2489):在java.lang.reflect.Method.invoke(Method.java:511)
02-12 02:15:33.851:E/AndroidRuntime(2489):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-12 02:15:33.851:E/AndroidRuntime(2489):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-12 02:15:33.851:E/AndroidRuntime(2489):在dalvik.system.NativeStart.main(本机方法)
02-12 02:15:33.851:E/AndroidRuntime(2489):原因:android.database.sqlite.SQLiteException:未知的数据库Marquer(代码1):,编译时:创建表Marquer.db(ID整数主键自动递增,经度文本不为NULL,纬度文本不为NULL);
02-12 02:15:33.851:E/AndroidRuntime(2489):在android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法)
02-12 02:15:33.851:E/AndroidRuntime(2489):在android.database.sqlite.SQLiteConnection.acquiredPreparedStatement(SQLiteConnection.java:882)
02-12 02:15:33.851:E/AndroidRuntime(2489):在android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
02-12 02:15:33.851:E/AndroidRuntime(2489):在android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
02-12 02:15:33.851:E/AndroidRuntime(2489):位于android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58)
02-12 02:15:33.851:E/AndroidRuntime(2489):位于android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:31)
02-12 02:15:33.851:E/AndroidRuntime(2489):在android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1663)
02-12 02:15:33.851:E/AndroidRuntime(2489):位于android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1594)
02-12 02:15:33.851:E/AndroidRuntime(2489):位于com.bongkorr.maps.MaBase.onCreate(MaBase.java:31)
02-12 02:15:33.851:E/AndroidRuntime(2489):在android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
02-12 02:15:33.851:E/AndroidRuntime(2489):位于android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
02-12 02:15:33.851:E/AndroidRuntime(2489):位于com.bongkorr.maps.MainActivity.sauver_point(MainActivity.java:86)
02-12 02:15:33.851:E/AndroidRuntime(2489):位于com.bongkorr.maps.MainActivity.onCreate(MainActivity.java:35)
02-12 02:15:33.851:E/AndroidRuntime(2489):在android.app.Activity.performCreate(Activity.java:5104)上
02-12 02:15:33.851:E/AndroidRuntime(2489):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)上
02-12 02:15:33.851:E/AndroidRuntime(2489):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
我有两个想法

  • 您可以再次查询表\地理点,再次清除地图和所有标记

    public void reloadMarkers() {
    
        MaBase maBaseSQLite = new MaBase(MainActivity.this, NOM_BDD, null, 1);
        SQLiteDatabase db = maBaseSQLite.getWritableDatabase();
        Cursor c = db.query(TABLE_GEOPOINT, new String[] { COL_ID, COL_LONG,
                COL_LAT }, null, null, null, null, null, null);
    
        int col = c.getCount(); // col=0 pas de enregistrement qui verifie la
        // condition
        if (col == 0) {
            Toast.makeText(MainActivity.this, "Pas de donnees ",
                    Toast.LENGTH_LONG).show();
            // effacer le contenue champ login et mot de passe
    
        } else {
    
            map.clear();        //Delete all markers in map
    
            //Add them all again, including the new ones
            c.moveToFirst();
            while (c.isAfterLast() == false) {
                // conversion int to string casting
                String id = "" + c.getInt(0);
                String longitude = c.getString(1);
                String latitude = c.getString(2);
                Marker marqueur = map.addMarker(new MarkerOptions()
                        .position(
                                new LatLng(Double.parseDouble(latitude),
                                        Double.parseDouble(longitude)))
                        .title("Bonjour Tunis")
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.drawable.mark2)));
                c.moveToNext();
            }
        }
        c.close();
        db.close();
    
    }
    
  • 您可以保留添加到数据库的新标记ID的引用

     void sauver_point() {
    
        MaBase maBaseSQLite = new MaBase(MainActivity.this, NOM_BDD, null, 1);
        SQLiteDatabase db = maBaseSQLite.getWritableDatabase();
        ContentValues values = new ContentValues();
        // values.put(COL_ID , "1");
        values.put(COL_LAT, "36.830722");
        values.put(COL_LONG, "10.165672");
    
        long id = db.insert(TABLE_GEOPOINT, null, values);  //Get the db id of the new inserted marker
    
        //You can keep the id in an array and then query your database looking for those specific ids.
    
        //The just add them to your map. Just don't clear the map his time! Or you will loose the old ones
    
        db.close();
    
    }
    
  • 编辑

    要向数据库中添加更多列,需要修改create语句

    private static final String CREATE_BDD = "CREATE TABLE " + TABLE_MARK  + " ("
    + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_LONG + " TEXT NOT NULL, " +COL_LAT+" TEXT NOT NULL, "+COL_NAME+" VARCHAR(250) NOT NULL, " +COL_IMAGE+" TEXT NOT NULL);";
    
    然后,当您执行查询时,只需获取新的columns值

    String id = "" + c.getInt(0);
    String longitude = c.getString(1);
    String latitude = c.getString(2);
    String name = c.getString(3);
    String iconEncoded = c.getString(4);
    
    并将该值设置为标记名称和图标

    Marker marqueur = map.addMarker(new MarkerOptions()
                            .position(
                                    new LatLng(Double.parseDouble(latitude),
                                            Double.parseDouble(longitude)))
                            .title(name)
                            .icon(iconDecoded);
    
    重要的

    请注意,
    iconEncoded
    是一个字符串,标记图像是一个“位图描述符”,因此在将其设置为标记图标之前,首先需要将
    iconEncoded
    转换为
    BitmapDescriptor
    ,并将该位图转换为
    BitmapDescriptor
    。我希望您已经知道如何操作,如果不是的话,还有很多与此相关的帖子我相信你会找到去那里的路


    另一件重要的事情是,在数据库中创建新列之前,您需要删除应用程序数据,否则您的应用程序将崩溃。最简单的方法是卸载应用程序并再次运行。这只需执行一次。

    您希望在哪种布局中显示数据?@kelvincer in MapsFragment,并连接我的MainActivityYou需要在activity_main中添加一个片段容器,然后生成片段transaction@kelvincer如何处理交易碎片?对不起,我很抱歉
    public void reloadMarkers() {
    
        MaBase maBaseSQLite = new MaBase(MainActivity.this, NOM_BDD, null, 1);
        SQLiteDatabase db = maBaseSQLite.getWritableDatabase();
        Cursor c = db.query(TABLE_GEOPOINT, new String[] { COL_ID, COL_LONG,
                COL_LAT }, null, null, null, null, null, null);
    
        int col = c.getCount(); // col=0 pas de enregistrement qui verifie la
        // condition
        if (col == 0) {
            Toast.makeText(MainActivity.this, "Pas de donnees ",
                    Toast.LENGTH_LONG).show();
            // effacer le contenue champ login et mot de passe
    
        } else {
    
            map.clear();        //Delete all markers in map
    
            //Add them all again, including the new ones
            c.moveToFirst();
            while (c.isAfterLast() == false) {
                // conversion int to string casting
                String id = "" + c.getInt(0);
                String longitude = c.getString(1);
                String latitude = c.getString(2);
                Marker marqueur = map.addMarker(new MarkerOptions()
                        .position(
                                new LatLng(Double.parseDouble(latitude),
                                        Double.parseDouble(longitude)))
                        .title("Bonjour Tunis")
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.drawable.mark2)));
                c.moveToNext();
            }
        }
        c.close();
        db.close();
    
    }
    
     void sauver_point() {
    
        MaBase maBaseSQLite = new MaBase(MainActivity.this, NOM_BDD, null, 1);
        SQLiteDatabase db = maBaseSQLite.getWritableDatabase();
        ContentValues values = new ContentValues();
        // values.put(COL_ID , "1");
        values.put(COL_LAT, "36.830722");
        values.put(COL_LONG, "10.165672");
    
        long id = db.insert(TABLE_GEOPOINT, null, values);  //Get the db id of the new inserted marker
    
        //You can keep the id in an array and then query your database looking for those specific ids.
    
        //The just add them to your map. Just don't clear the map his time! Or you will loose the old ones
    
        db.close();
    
    }
    
    private static final String CREATE_BDD = "CREATE TABLE " + TABLE_MARK  + " ("
    + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_LONG + " TEXT NOT NULL, " +COL_LAT+" TEXT NOT NULL, "+COL_NAME+" VARCHAR(250) NOT NULL, " +COL_IMAGE+" TEXT NOT NULL);";
    
    String id = "" + c.getInt(0);
    String longitude = c.getString(1);
    String latitude = c.getString(2);
    String name = c.getString(3);
    String iconEncoded = c.getString(4);
    
    Marker marqueur = map.addMarker(new MarkerOptions()
                            .position(
                                    new LatLng(Double.parseDouble(latitude),
                                            Double.parseDouble(longitude)))
                            .title(name)
                            .icon(iconDecoded);