Reputation: 17
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
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
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