0

我是 android 新手,正在尝试学习如何创建并将内容插入数据库。我设法创建它并且应用程序运行但每当我尝试在其中插入东西时都会收到此错误:

Error inserting trip type=Hi title=Beach destination=Gotham
android.database.sqlite.SQLiteException near "type": synthax error(code 1):, while
compiling: INSERT INTO trips(trip type, title, destination) VALUES (?,?,?)

这是我的 PlanTrip 活动数据库部分:

private EditText editText1;
private EditText editText2;
private EditText editText3;

DBAdapter db = new DBAdapter(this);

try {           
    String destPath = "/data/data/" + getPackageName() + "/databases/Trips.db";
    File f = new File(destPath);            
    if (!f.exists()) {          
        CopyDB( getBaseContext().getAssets().open("db"), 
        new FileOutputStream(destPath));
    }
} catch (FileNotFoundException e) { 
     e.printStackTrace();
} catch (IOException e) { 
     e.printStackTrace();
    }

EditText titleTxt = (EditText)findViewById(R.id.editText1);
EditText destinationTxt = (EditText)findViewById(R.id.editText2);
EditText tripTypeTxt = (EditText)findViewById(R.id.editText3);

db.open();
long id = db.insertRecord(titleTxt.getText().toString(), 
destinationTxt.getText().toString(), tripTypeTxt.getText().toString());
db.close();

还有我的 DBAdapter:

public class DBAdapter {

public static final String KEY_TRIPID = "id";
public static final String KEY_TITLE = "title";
public static final String KEY_DESTINATION = "destination";
public static final String KEY_TRIP_TYPE = "trip type";
public static final String KEY_STARTDATE = "start date";
public static final String KEY_ENDDATE = "end date";
private static final String TAG = "DBAdapter";

private static final String DATABASE_NAME = "Trips.db";
private static final String DATABASE_TABLE = "trips";
private static final int DATABASE_VERSION = 1;

// Database creation sql statement
/*private static final String DATABASE_CREATE = 
      "create table if not exists trips (trip_id integer primary key   autoincrement, " 
    + "title VARCHAR not null, destination VARCHAR not null, triptype VARCHAR not null,"
    + " startdate VARCHAR, enddate VARCHAR);";*/
private static final String DATABASE_CREATE = 
      "CREATE table if not exists " + DATABASE_TABLE + " (" + KEY_TRIPID
        + " integer PRIMARY KEY autoincrement," + KEY_TITLE + ","
        + KEY_DESTINATION + ", " + KEY_TRIP_TYPE + ");";

private final Context context;

private DatabaseHelper DBHelper;
private SQLiteDatabase db;


public DBAdapter(Context ctx) {
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper
{
  DatabaseHelper(Context context)
  {
      super(context, DATABASE_NAME, null, DATABASE_VERSION);
  }

  public void onCreate(SQLiteDatabase db) 
  {
      try
      {
          db.execSQL(DATABASE_CREATE);
      }
      catch (SQLException e)
      {
          e.printStackTrace();
      }
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
  {
      Log.w(TAG, "Upgrading database from version " + oldVersion + 
             " to " + newVersion + ", which will destroy all old data");
      db.execSQL("DROP TABLE IF EXISTS trips" );
      onCreate(db);
  }
}

//open db
public DBAdapter open() throws SQLException
{
  db = DBHelper.getWritableDatabase();
  return this;
}

//close db
  public void close()
{
  DBHelper.close();
}

  //insert record into db
  public long insertRecord(String title, String destination, String tripType)
{
  ContentValues initialValues = new ContentValues();
  initialValues.put(KEY_TITLE, title);
  initialValues.put(KEY_DESTINATION, destination);
  initialValues.put(KEY_TRIP_TYPE, tripType);
  Toast.makeText(context, "Record Added", Toast.LENGTH_SHORT).show();
  return db.insert(DATABASE_TABLE, null, initialValues);
}

//delete record
public boolean deleteRecord(long rowId)
{
  return db.delete(DATABASE_TABLE, KEY_TRIPID + "=" + rowId, null) > 0;
}

//get all records
public Cursor getAllRecords()
{
  return db.query(DATABASE_TABLE, new String[] {KEY_TRIPID, KEY_TITLE, KEY_DESTINATION, KEY_TRIP_TYPE},
          null, null, null, null, null);
}

//get specific record
public Cursor getRecord(long rowId) throws SQLException
{
  Cursor mCursor = 
        db.query(true, DATABASE_TABLE, new String[] {KEY_TRIPID, KEY_TITLE, KEY_DESTINATION, KEY_TRIP_TYPE},
                KEY_TRIPID + "=" + rowId, null, null, null, null, null);
  if (mCursor != null)
      mCursor.moveToFirst();
return mCursor; 
}

//update record
public boolean UpdateRecord (long rowId, String title, String destination, String tripType)
    {
  ContentValues args = new ContentValues();
  args.put(KEY_TITLE, title);
  args.put(KEY_DESTINATION, destination);
  args.put(KEY_TRIP_TYPE, tripType);
  return db.update(DATABASE_TABLE, args, KEY_TRIPID + "=" + rowId, null) > 0;
    }
} 
4

4 回答 4

3
public static final String KEY_TRIP_TYPE = "trip type";

代替

public static final String KEY_TRIP_TYPE = "trip_type";

因为 sqlite 的数据库字段中不允许有空格。

如果你已经在 assets db 文件夹中创建了数据库表,那么不要在 java 文件中创建它。如果你没有在外部创建表,那么使用这个:

private static final String DATABASE_CREATE = 
      "create table if not exists trips (trip_id integer primary key   autoincrement, " 
    + "title VARCHAR not null, destination VARCHAR not null, triptype VARCHAR not null,"
    + " startdate VARCHAR, enddate VARCHAR);

如果这个答案对你有用,请投票。

于 2013-09-19T05:07:35.150 回答
1

似乎您的数据库列名中有空格,请改用“_”:

public static final String KEY_TRIP_TYPE = "trip_type";
于 2013-09-19T04:37:31.333 回答
0

您的列名行程类型之间有一个空格。这意味着你将不得不在它周围使用`。例如“旅行类型”。或者更好的是,用下划线代替空格,而不是空格。

例如public static final String KEY_TRIP_TYPE = "trip_type";

您也可以对其他列执行此操作。

注意:由于您更改了列名,您可能需要清除数据,或卸载然后重新安装应用程序。

于 2013-09-19T04:37:55.590 回答
0

改变这个:

public static final String KEY_TRIPID = "_id";
public static final String KEY_TITLE = "title";
public static final String KEY_DESTINATION = "destination";
public static final String KEY_TRIP_TYPE = "trip_type";
public static final String KEY_STARTDATE = "start_date";
public static final String KEY_ENDDATE = "end_date";

更多请看这里。并且您还需要使用数据库版本升级来更新表结构。

于 2013-09-19T04:38:05.390 回答