我经历了很多论坛的答案,通常问题不是 添加一个“,”或一个空格,它将把SQL语句改为不应该的东西。
我试着看看我的,我仍然无法在我的onCreate中找到错误。我每次都使用Genymotion模拟应用程序,因此模拟器不能具有以前的数据库版本,所以它不应该是onUpgrade方法的问题。
这是logcat
09-19 07:54:26.137 7344-7344/com.example.cartermah.mywishlist E/SQLiteLog﹕ (1) table wishes has no column named content
09-19 07:54:26.137 7344-7344/com.example.cartermah.mywishlist E/SQLiteDatabase﹕ Error inserting content=jalksjldk title=HIHI recorddate=1442663666139
android.database.sqlite.SQLiteException: table wishes has no column named content (code 1): , while compiling: INSERT INTO wishes(content,title,recorddate) VALUES (?,?,?)
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
at data.DatabaseHandler.addWishes(DatabaseHandler.java:67)
at com.example.cartermah.mywishlist.MainActivity.saveToDB(MainActivity.java:53)
at com.example.cartermah.mywishlist.MainActivity.access$000(MainActivity.java:15)
at com.example.cartermah.mywishlist.MainActivity$1.onClick(MainActivity.java:36)
at android.view.View.performClick(View.java:4240)
at android.view.View$PerformClick.run(View.java:17721)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
09-19 07:54:26.137 7344-7344/com.example.cartermah.mywishlist V/Wished saved!﹕ yeah
数据库处理程序代码是
package data;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;
import com.example.cartermah.mywishlist.MainActivity;
import java.sql.Date;
import java.util.ArrayList;
import model.MyWish;
/**
* Created by CarterMah on 14/09/2015.
*/
public class DatabaseHandler extends SQLiteOpenHelper {
public final ArrayList<MyWish> wishList = new ArrayList<>();
public DatabaseHandler(Context context) {
super(context, Constants.DATABASE_NAME, null, Constants.DATABASE_VERSION );
}
@Override
public void onCreate(SQLiteDatabase db) {
//This is where the table is created
String CREATE_WISHES_TABLE = "CREATE TABLE " + Constants.TABLE_NAME + "(" + Constants.KEY_ID +
" INTEGER PRIMARY KEY, " + Constants.TITLE_NAME + " TEXT, " + Constants.CONTENT_NAME +
" TEXT, " + Constants.DATE_NAME + " LONG" + ");";
db.execSQL(CREATE_WISHES_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + Constants.TABLE_NAME);
//Create a new table
onCreate(db);
}
public void addWishes (MyWish wish) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(Constants.TITLE_NAME, wish.getTitle());
values.put(Constants.CONTENT_NAME, wish.getContent());
values.put(Constants.DATE_NAME, java.lang.System.currentTimeMillis());
db.insert(Constants.TABLE_NAME, null, values);
Log.v("Wished saved!","yeah");
db.close();
}
// Get all wishes
public ArrayList<MyWish> getWishes() {
String selectQuery = "SELECT * FROM " + Constants.TABLE_NAME;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(Constants.TABLE_NAME, new String[]{Constants.KEY_ID,
Constants.TITLE_NAME, Constants.CONTENT_NAME, Constants.DATE_NAME,},
null, null, null, null, Constants.DATE_NAME + " DESC");
// loop through cursor to get every row of data
if (cursor.moveToFirst()) {
do{
MyWish wish = new MyWish();
wish.setTitle(cursor.getString(cursor.getColumnIndex(Constants.TITLE_NAME)));
wish.setContent(cursor.getString(cursor.getColumnIndex(Constants.CONTENT_NAME)));
java.text.DateFormat dateFormat = java.text.DateFormat.getDateInstance();
String dataData = dateFormat.format(new Date(cursor.getLong(cursor.getColumnIndex(Constants.DATE_NAME))).getTime());
wish.setRecordDate(dataData);
wishList.add(wish);
}while (cursor.moveToNext());
}
return wishList;
}
}
Constants.java
public class Constants {
public static final String DATABASE_NAME = "wishdb";
public static final int DATABASE_VERSION = 1;
public static final String TABLE_NAME = "wishes";
public static final String TITLE_NAME = "title";
public static final String CONTENT_NAME = "content";
public static final String DATE_NAME = "recorddate";
public static final String KEY_ID = "_id";
}
MainActivity
package com.example.cartermah.mywishlist;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import data.DatabaseHandler;
import model.MyWish;
public class MainActivity extends AppCompatActivity {
private EditText title;
private EditText content;
private Button saveButton;
private DatabaseHandler dba;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dba = new DatabaseHandler(MainActivity.this);
title = (EditText)findViewById(R.id.titleEditText);
content = (EditText)findViewById(R.id.wishEditText);
saveButton = (Button)findViewById(R.id.saveButton);
saveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveToDB();
}
});
}
private void saveToDB() {
MyWish wish = new MyWish();
wish.setTitle(title.getText().toString().trim());
wish.setContent(content.getText().toString().trim());
dba.addWishes(wish);
dba.close();
// clear the form once users click the save button.
title.setText("");
content.setText("");
// Intent i = new Intent(MainActivity.this, WishDetailActivity.class);
// startActivity(i);
}
}
答案 0 :(得分:0)
你需要在插入时添加id,因为id不是autoincrement.OR使id自动增量。
答案 1 :(得分:0)
你提到使用Genymotion作为现有数据库不会成为问题的原因,但我不认为这是一个准确的假设。除非您在启动新应用程序之前完全卸载该应用程序,否则以前的数据库版本仍在设备上,并且不会被覆盖。我建议从Genymotion完全卸载该应用程序,然后使用最新的onCreate语句安装它,看看是否全新安装会覆盖以前数据库版本可能出现的任何情况。
答案 2 :(得分:0)
我遇到了同样的问题,但我所做的只是卸载应用程序并重新安装,它完美无缺。