UserK
UserK

Reputation: 17

Android SQLiteDatabase inserting error, possible creation issue

I get the error in my logcat every time I try to call addSatInstance(). I get the insert error from SQL lite. I have no idea what is wrong. I think something is wrong when the db is created, or in the string I use to create the table.

Here is my error:

02-22 16:55:24.821: E/SQLiteDatabase(1073): Error inserting id=0 altitude=404.0 name= instance  userid=0 bearing=404.0 provider=Value made it lng=404.0 accuracy=404.0 lat=404.0
02-22 16:55:24.821: E/SQLiteDatabase(1073): android.database.sqlite.SQLiteConstraintException: PRIMARY KEY must be unique (code 19)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at sat.save.SCSQLHelper.addSatInstance(SCSQLHelper.java:89)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at sat.save.MainActivity$1.onClick(MainActivity.java:105)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at android.view.View.performClick(View.java:4240)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at android.view.View$PerformClick.run(View.java:17721)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at android.os.Handler.handleCallback(Handler.java:730)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at android.os.Looper.loop(Looper.java:137)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at android.app.ActivityThread.main(ActivityThread.java:5103)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at java.lang.reflect.Method.invokeNative(Native Method)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at java.lang.reflect.Method.invoke(Method.java:525)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-22 16:55:24.821: E/SQLiteDatabase(1073):     at dalvik.system.NativeStart.main(Native Method)

Here is my SQLHelper

public class SCSQLHelper extends SQLiteOpenHelper {


// Sat table name
private static final String TABLE_SAT = "sat";

// Sat Table Columns names
private static final String KEY_ID = "id";
private static final String KEY_NAME = "name";
private static final String KEY_USERID = "userid";
private static final String KEY_LAT = "lat";
private static final String KEY_LNG = "lng";
private static final String KEY_PROVIDER = "provider";
private static final String KEY_ACCURACY = "accuracy";
private static final String KEY_ALTITUDE = "altitude";
private static final String KEY_BEARING = "bearing";

private static final String[] COLUMNS = {KEY_ID,KEY_NAME,KEY_USERID,KEY_LAT,KEY_LNG,KEY_PROVIDER,KEY_ACCURACY,KEY_ALTITUDE,KEY_BEARING};

public SCSQLHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);  
}

@Override
public void onCreate(SQLiteDatabase db) {
    // SQL statement to create book table
    String CREATE_SAT_TABLE = "CREATE TABLE sat ( " +
            "id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
            "name TEXT, "+
            "userid INTEGER, "+
            "lat REAL, "+
            "lng REAL, "+
            "provider TEXT, "+
            "accuracy REAL, "+
            "altitude REAL, "+
            "bearing REAL )";

    // create books table
    db.execSQL(CREATE_SAT_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // Drop older books table if existed
    db.execSQL("DROP TABLE IF EXISTS sat");

    // create fresh books table
    this.onCreate(db);
}

public void addSatInstance(SatInstance satinstance){
    //for logging
    Log.d("addBook", satinstance.toString()); 

    // 1. get reference to writable DB
    SQLiteDatabase db = this.getWritableDatabase();

    // 2. create ContentValues to add key "column"/value
    ContentValues values = new ContentValues();
    values.put(KEY_ID, satinstance.getId()); 
    values.put(KEY_NAME, satinstance.getName());
    values.put(KEY_USERID, satinstance.getUserId());
    values.put(KEY_LAT, satinstance.getLat());
    values.put(KEY_LNG, satinstance.getLng());
    values.put(KEY_PROVIDER, satinstance.getProvider());
    values.put(KEY_ACCURACY, satinstance.getAccuracy());
    values.put(KEY_ALTITUDE, satinstance.getAltitude());
    values.put(KEY_BEARING, satinstance.getBearing());

    // 3. insert
    db.insert(TABLE_SAT, // table
            null, //nullColumnHack
            values); // key/value -> keys = column names/ values = column values

    // 4. close
    db.close(); 
}   

}

Here is my class that is used in the table

public class SatInstance {

private int id;
private String name = " instance ";
private int userid;
private double lat = 0;
private double lng = 0;
private String provider = new String("Data Error");
private float accuracy = 0;
private double altitude = 0;
private float bearing = 0;

public SatInstance(){}

public SatInstance(String name, int userid, double lat, double lng, String provider, float accuracy, double altitude, float bearing) {
    super();
    this.name = name;
    this.userid = userid;
    this.lat = lat;
    this.lng = lng;
    this.provider = provider;
    this.accuracy = accuracy;
    this.altitude = altitude;
    this.bearing = bearing;
}

This is where it is called:

SatInstance satinstance = new SatInstance();


            satinstance.setLat(404);
            satinstance.setLng(404);
            satinstance.setProvider("Value made it");
            satinstance.setAccuracy(404);
            satinstance.setAltitude(404);
            satinstance.setBearing(404);
            db.addSatInstance(satinstance);

Please let me know if you need anymore code. Thanks!!

Upvotes: 1

Views: 3202

Answers (2)

laalto
laalto

Reputation: 152847

Remove

values.put(KEY_ID, satinstance.getId()); 

so the database can generate the autoincrement id for your rows.

What happens is that you never initialize the id in your satinstance so it remains in its default 0 value and explicitly inserting multiple rows with the same primary key value causes the SQLiteConstraintException: PRIMARY KEY must be unique.

Upvotes: 3

Merlevede
Merlevede

Reputation: 8170

You already have inserted an item with id=0, and it doesn't allow duplicates. Since the key is defined as autoincrement, you can just ommit it in the insert operation.

If you provide the id in your insert, then the autoincrement behavior is overriden.

Upvotes: 0

Related Questions