Создание таблицы и вставка данных

Я пытаюсь вставить данные в таблицу базы данных Android.

База данных создана. Я не получаю ошибок, но данные не вставляются.

Я добавил исключение, и я получил некоторые ошибки.

Основная деятельность

package com.example.shaz.geotag;

import android.app.Dialog;
import android.content.pm.PackageManager;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.identity.intents.Address;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
 import com.google.android.gms.maps.OnMapReadyCallback;
 import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import java.io.IOException;
import java.util.List;

public class MainActivity extends AppCompatActivity implements                     OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,    GoogleApiClient.OnConnectionFailedListener,       com.google.android.gms.location.LocationListener {
//to access map fragment
GoogleMap mGoogleMap;
GoogleApiClient mGoogleApiClient;
DatabaseHelper myDb;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    if (googleServicesAvailable()) {
        Toast.makeText(this, "Started", Toast.LENGTH_LONG).show();
        setContentView(R.layout.activity_main);
        initMap();
    } else {
        //No google map layout
    }

}


public boolean googleServicesAvailable() {
    GoogleApiAvailability api = GoogleApiAvailability.getInstance();
    int isAvailable = api.isGooglePlayServicesAvailable(this);
    if (isAvailable == ConnectionResult.SUCCESS) {
        return true;
    } else if (api.isUserResolvableError(isAvailable)) {
        Dialog dialog = api.getErrorDialog(this, isAvailable, 0);
        dialog.show();
    } else {
        Toast.makeText(this, "Cant connect to play services", Toast.LENGTH_LONG).show();
    }
    return false;

}


private void initMap() {
    MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.mapFragment);
    mapFragment.getMapAsync(this);//it gets map details and



}



@Override
public void onMapReady(GoogleMap googleMap) {
    mGoogleMap = googleMap;
    myDb=new DatabaseHelper(this);




    if(mGoogleMap!=null){
        mGoogleMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter(){

            @Override
            public View getInfoWindow(Marker marker) {
                return null;
            }

            @Override
            public View getInfoContents(Marker marker) {
                View v = getLayoutInflater().inflate(R.layout.info_window,null);

                TextView tvLat= (TextView) v.findViewById(R.id.tv_lat);
                TextView tvLng= (TextView) v.findViewById(R.id.tv_lng);

                LatLng ll=marker.getPosition();

                tvLat.setText("Latitude "+ ll.latitude);
                tvLng.setText("Longitude "+ll.longitude);

                return v;
            }
        });
    }






    if (mGoogleApiClient == null) {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
    }
        mGoogleApiClient.connect();



}

private void goToLocationZoom(double lat, double lng, float zoom) {
    LatLng ll = new LatLng(lat, lng);
    CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, zoom);
    mGoogleMap.moveCamera(update);
}

Marker marker;



public void geoLocate(View view) throws IOException {
                //       
       //            if(marker!=null)

       //        {

           //            marker.remove();

                  //        }

        MarkerOptions options =new MarkerOptions()

                .position(new LatLng(lat,lng))
                    .icon(BitmapDescriptorFactory.
             defaultMarker(BitmapDescriptorFactory.HUE_GREEN));

             marker = mGoogleMap.addMarker(options);


    boolean isInserted = myDb.insertData(Double.toString(lat),Double.toString(lng));
    if(isInserted==true){
        Toast.makeText(MainActivity.this,"Data Inserted",Toast.LENGTH_LONG).show();
    }
    else
        Toast.makeText(MainActivity.this,"Data not Inserted",Toast.LENGTH_LONG).show();

         }

LocationRequest mLocationRequest;

@Override
public void onConnected(Bundle bundle) {
    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(1000);


    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    else {
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest,this);
    }
}
@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

    double lat;
    double lng;
@Override
public void onLocationChanged(Location location) {
    if(location == null){
        Toast.makeText(this, "Cant get current location", Toast.LENGTH_LONG).show();
    } else {
        lat=location.getLatitude();
        lng=location.getLongitude();
        LatLng ll = new LatLng(lat, lng);
        CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, 17);
        mGoogleMap.animateCamera(update);
    }
}
   }

DatabaseHelper
Вот мой класс базы данных. Я думаю, что это хорошо, но все еще ошибки.

  package com.example.shaz.geotag;

   import android.content.ContentValues;
   import android.content.Context;
     import android.database.SQLException;
       import android.database.sqlite.SQLiteDatabase;
     import android.database.sqlite.SQLiteOpenHelper;
      import android.util.Log;
     import android.widget.Toast;


     public class DatabaseHelper extends SQLiteOpenHelper {
      public static final String DATABASE_NAME="GEOTAG";
      public static final String TABLE_NAME="GEOTAG_table";
      public static final String CoL_1="ID";
       public static final String CoL_2="LATITUDE";
      public static final String CoL_3="LONGITUDE";
       public static Context c;




public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1);
    c=context;
    Toast.makeText(c, "Database", Toast.LENGTH_LONG).show();
}

@Override
public void onCreate(SQLiteDatabase db) {
    try {
        db.execSQL("CREATE TABLE " + TABLE_NAME + "(" + CoL_1 + "INTEGER PRIMARY KEY AUTOINCREMENT, " + CoL_2 + " TEXT, " + CoL_3 + " TEXT);");

    } catch (SQLException e) {
        Log.e("HEY","Error creating");
        e.printStackTrace();
    }

    Toast.makeText(c, "Database Created", Toast.LENGTH_LONG).show();


}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);

}

public boolean insertData (String lat,String lng){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues =new ContentValues();
    contentValues.put(CoL_2,lat);
    contentValues.put(CoL_3,lng);
    long res =db.insert(TABLE_NAME,null,contentValues);
    if (res==-1)
        return false;
    else
        return true;


}

      }

ЖУРНАЛ
И наконец войдите.

   E/SQLiteDatabase: Error inserting LONGITUDE=71.4924987 LATITUDE=30.2575152
              android.database.sqlite.SQLiteException: no such table: GEOTAG_table (Sqlite code 1): , while compiling: INSERT INTO GEOTAG_table(LONGITUDE,LATITUDE) VALUES (?,?), (OS error - 2:No such file or directory)
                  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:897)
                  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:508)
                  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:63)
                  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
                  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1504)
                  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1371)
                  at com.example.shaz.geotag.DatabaseHelper.insertData(DatabaseHelper.java:59)
                  at com.example.shaz.geotag.MainActivity$override.geoLocate(MainActivity.java:187)
                  at com.example.shaz.geotag.MainActivity$override.access$dispatch(MainActivity.java)
                  at com.example.shaz.geotag.MainActivity.geoLocate(MainActivity.java:0)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                  at android.view.View.performClick(View.java:5273)
                  at android.view.View$PerformClick.run(View.java:21315)
                  at android.os.Handler.handleCallback(Handler.java:743)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:150)
                  at android.app.ActivityThread.main(ActivityThread.java:5665)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:689)
          I/art: GC statistics: 19 time(s), freed 198661(66MB) objects, paused 22.298ms total 447.358ms
        W/InputMethodManager: Current bind isn't success!

Я не могу понять, почему таблица не создана. Нет синтаксической ошибки.

3 ответа

Решение

Наконец-то.. Работает я добавил расширение .db в имя базы данных и изменил код в функции onCreate как

   "CREATE TABLE " + TABLE_NAME + " (" + CoL_1 + " INTEGER PRIMARY KEY AUTOINCREMENT, " + CoL_2 +" TEXT,"+ CoL_3 +" TEXT)"

Я удалил точку с запятой и добавил место для скобок

Из вашего журнала ошибок нет таблицы типа "GEOTAG_table". Если вы используете эмулятор, вы можете извлечь файл БД и проверить, создана ли таблица или нет, если вы используете устройство, вы можете использовать эту команду

CD / DD: \ Android \ SDK \ platform-tools // путь Android SDK

оболочка adb -d

run-as com.pkg.pkgname

cat /data/data/com.pkg.pkgname/databases/UR_DB_NAME> / sdcard / UR_DB_NAME

он скопирует ваш файл базы данных на SD-карту устройства. С помощью браузера Sqlite вы можете открыть файл db и проверить, создана таблица или нет

удали это myDb=new DatabaseHelper(this); от onMapReady(GoogleMap googleMap)метод и использовать его в деятельности oncreate метод

Я подключил ваш код, и он выглядит как CREATE TABLE здесь нужно место "(" + CoL_1 + " INTEGER, Он попытался создать столбец с именем IDINTEGER и затем не указал тип данных. Здесь это исправлено (и сработало в моем быстром тесте).

@Override
public void onCreate(SQLiteDatabase db) {
    try {
        db.execSQL("CREATE TABLE " + TABLE_NAME + "(" + CoL_1 + " INTEGER PRIMARY KEY AUTOINCREMENT, " + CoL_2 + " TEXT, " + CoL_3 + " TEXT);");
    } catch (SQLException e) {
        Log.e("HEY","Error creating");
        e.printStackTrace();
    }
    Toast.makeText(c, "Database Created", Toast.LENGTH_LONG).show();
}
Другие вопросы по тегам