创建表和插入数据

时间:2017-02-19 07:04:11

标签: android sqlite google-api android-sqlite google-client

我正在尝试将数据插入Android数据库表。

创建数据库。我没有错误,但没有插入数据。

我添加了异常,但我遇到了一些错误。

MainActivity

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;


}

      }

LOG
最后登录。

   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 个答案:

答案 0 :(得分:1)

从您的错误日志中没有像“GEOTAG_table”这样的表 如果您正在使用模拟器,您可以拉取db文件并检查表是否已创建,如果您使用的是设备,则可以使用此命令

cd / D D:\ Android \ SDK \ platform-tools // android sdk path

adb -d shell

run-as com.pkg.pkgname

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

它会将您的db文件复制到设备SD卡。使用Sqlite浏览器,您可以打开db文件并检查表是否已创建

myDb=new DatabaseHelper(this);方法移除此onMapReady(GoogleMap googleMap)并在活动中使用它oncreate方法

答案 1 :(得分:0)

我插入了您的代码,看起来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();
}

答案 2 :(得分:0)

最后..它的工作 我在数据库名称中添加了扩展名 .db 并将onCreate函数中的代码更改为

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

我删除了分号并为括号添加了空格