在我的数据库中添加新项目时,我的应用程序发生了异常。
do local e = weaponsList.earth
e.fireTime = 2
e.fireRate = 2
e.speed = 2
end
我的适配器:
Error inserting time=2016年05月14日 23:42:03 content=zxdc
android.database.sqlite.SQLiteConstraintException: NOT NULL constraint failed: albums.path (code 1299)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:780)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1471)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
at com.driver.shinekaye.olddriver.AddContent.addDB(AddContent.java:53)
at com.driver.shinekaye.olddriver.AddContent.onClick(AddContent.java:70)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
表格:
public class MyAdapter extends BaseAdapter {
private Context context;
private Cursor cursor;
private LinearLayout layout;
public MyAdapter(Context context, Cursor cursor) {
this.context = context;
this.cursor = cursor;
}
@Override
public int getCount() {
return cursor.getCount();
}
@Override
public Object getItem(int position) {
return cursor.getPosition();
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
layout = (LinearLayout) inflater.inflate(R.layout.activity_secretalbum_item, null);
TextView contentTv = (TextView) layout.findViewById(R.id.list_content);
TextView timeTv = (TextView) layout.findViewById(R.id.list_time);
ImageView imgIv = (ImageView) layout.findViewById(R.id.list_img);
ImageView videoIv = (ImageView) layout.findViewById(R.id.list_video);
cursor.moveToPosition(position);
String content = cursor.getString(cursor.getColumnIndex("content"));
String time = cursor.getString(cursor.getColumnIndex("time"));
contentTv.setText(content);
timeTv.setText(time);
return layout;
}
}
查询
public class SecretAlbumDB extends SQLiteOpenHelper {
public static final String TABLE_NAME = "albums";
public static final String CONTENT = "content";
public static final String PATH = "path";
public static final String VIDEO = "video";
public static final String ID = "_id";
public static final String TIME = "time";
public SecretAlbumDB(Context context) {
super(context, "albums", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + "(" + ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT," + CONTENT
+ " TEXT NOT NULL," + PATH
+ " TEXT NOT NULL," + VIDEO
+ " TEXT NOT NULL," + TIME
+ " TEXT NOT NULL)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
插入:
public void selectDB() {
Cursor cursor = dbReader.query(SecretAlbumDB.TABLE_NAME, null, null, null, null, null, null);
adapter = new MyAdapter(this, cursor);
list.setAdapter(adapter);
有人可以帮助我吗?
答案 0 :(得分:11)
数据库定义中包含以下NOT NULL值:
CONTENT
PATH
VIDEO
TIME
但是在你的addDB中,你只在ContentValues中放置了CONTENT和TIME,所以它肯定也在寻找PATH和VIDEO。如果它们不存在,它将给出错误。有两种解决方案:
解决方案1:
从VIDEO和PATH中删除NOT NULL约束:
db.execSQL("CREATE TABLE " + TABLE_NAME + "(" + ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT," + CONTENT
+ " TEXT NOT NULL," + PATH
+ " TEXT," + VIDEO
+ " TEXT," + TIME
+ " TEXT NOT NULL)");
解决方案2:
将VIDEO和PATH添加到ContentValues:
private void addDB() {
ContentValues cv = new ContentValues();
cv.put(SecretAlbumDB.CONTENT, editText.getText().toString());
cv.put(SecretAlbumDB.TIME, getTime());
cv.put(SecretAlbumDB.VIDEO, getVideo());
cv.put(SecretAlbumDB.Path, getPath());
dbWriter.insert(SecretAlbumDB.TABLE_NAME, null, cv);
}
答案 1 :(得分:1)
您确定已将所有字段(列)声明为NOT NULL
,并且在插入cv
时您没有将值放到这些字段中。要使这些列null
可以接受,要么为cv
的每个列将所有值都设置为NOT NULL
。