Java 使用SQLite存储数据
我不太熟悉使用SQL来存储Android数据项,但下面我有两种方法来插入新数据项和打印所有现有数据 我的飞行类别具有以下属性:Java 使用SQLite存储数据,java,android,sql,Java,Android,Sql,我不太熟悉使用SQL来存储Android数据项,但下面我有两种方法来插入新数据项和打印所有现有数据 我的飞行类别具有以下属性: 航班号-字符串 航空公司字符串 日期字符串 图像路径-字符串 注册字符串 类型-字符串ID int(每个实例都是唯一的) 由于某些原因,我无法打印数据,我不确定insertFlight()方法或databaseToString()方法是否存在问题 public class DatabaseSQ extends SQLiteOpenHelper { publ
- 航班号-字符串
- 航空公司字符串
- 日期字符串
- 图像路径-字符串
- 注册字符串
- 类型-字符串ID
- int(每个实例都是唯一的)
insertFlight()
方法或databaseToString()
方法是否存在问题
public class DatabaseSQ extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "FlightDatabase.db";
public static final String TABLE_FLIGHTS = "flights";
private static final int DATABASE_VERSION = 1;
public static final String FLIGHT_COLUMN_ID = "_id";
public static final String FLIGHT_NUMBER = "number";
public static final String FLIGHT_DATE = "date";
public static final String FLIGHT_REG = "reg";
public static final String FLIGHT_AIRLINE = "airline";
public static final String FLIGHT_TYPE = "type";
public static final String FLIGHT_IMAGE_PATH = "image";
public DatabaseSQ(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String query = "CREATE TABLE " + TABLE_FLIGHTS + "(" +
FLIGHT_COLUMN_ID + "INTEGER PRIMARY KEY, " +
FLIGHT_NUMBER + " TEXT, " +
FLIGHT_DATE + " TEXT, " +
FLIGHT_REG + " TEXT, " +
FLIGHT_AIRLINE + " TEXT, " +
FLIGHT_TYPE + " TEXT, " +
FLIGHT_IMAGE_PATH + " TEXT " +
");";
db.execSQL(query);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_FLIGHTS);
onCreate(db);
}
public void insertFlight(Flight toADD) {
ContentValues contentValues = new ContentValues();
contentValues.put(FLIGHT_COLUMN_ID, toADD.getId());
contentValues.put(FLIGHT_NUMBER, toADD.getFlightNumber());
contentValues.put(FLIGHT_DATE, toADD.getDate());
contentValues.put(FLIGHT_REG, toADD.getReg());
contentValues.put(FLIGHT_AIRLINE, toADD.getAirline());
contentValues.put(FLIGHT_TYPE, toADD.getType());
contentValues.put(FLIGHT_IMAGE_PATH, toADD.getImagePath());
SQLiteDatabase db = getWritableDatabase();
db.insert(TABLE_FLIGHTS, null, contentValues);
db.close();
}
public String databaseToString() {
String dbString = "";
SQLiteDatabase db = getWritableDatabase();
String query = "SELECT * FROM " + TABLE_FLIGHTS + " WHERE 1";
Cursor c = db.rawQuery(query, null);
c.moveToFirst();
while(!c.isAfterLast()) {
if(c.getString(c.getColumnIndex("number")) != null) {
dbString += c.getString(c.getColumnIndex("number"));
dbString += "\n";
}
c.moveToNext();
}
db.close();
return dbString;
}
}
当在另一个活动文件中单击按钮时,必须存储一个新的航班对象并将其航班号传递给主活动时,将调用该数据库。(数据库对象dbHandler在前面已实例化)
问题是因为您在表上的光标移动错误。尝试如下
Cursor c = db.rawQuery(query, null);
if(c != null) {
while(c.moveToNext()) {
dbString += c.getString(c.getColumnIndex("number"));
dbString += "\n";
}
c.close()
}
列名与其类型之间缺少空格。这本身并不是语法错误,列名只是变成了\u idINTEGER
db.insert(TABLE_FLIGHTS, null, contentValues);
由于没有FLIGHT\u COLUMN\u ID
列,此插入将失败。使用insertOrThrow()
而不是insert()
在出现错误时引发异常
此外,您不需要在整数主键
列中插入值-将自动为您生成一个新的rowid
更正
CREATE TABLE
SQL后,您可以卸载应用程序以使onCreate()
再次运行。您是否可以尝试使用SELECT*FROM“+TABLE\u航班作为查询?请删除不必要的“WHERE 1”部分。尝试过,不起作用:(我试过了,但没有起作用,因为我确实将光标移到了第一行,所以我看不出有多大的不同。什么“SELECT*FROM”+TABLE_FLIGHTS+“WHERE 1”do?这里有点问题!WHERE需要什么子句?
FLIGHT_COLUMN_ID + "INTEGER PRIMARY KEY, " +
contentValues.put(FLIGHT_COLUMN_ID, toADD.getId());
db.insert(TABLE_FLIGHTS, null, contentValues);