我是android编程的新手,我用this tutorial创建了一个多表SQLite数据库。我创建了一个包含两个表的数据库,其中包含所有必需的类。我稍微修改了一下,在执行时添加一个try / catch来检查表是否已经存在。我在构建过程中没有任何错误。在手机执行时(Moto G Play),数据库对象被实例化,但当我尝试用选择的RawQuery打开Cursor时,我收到错误:
03-09 07:54:51.823 6235-6235 / com.petapp.petfinder D / TReceiver:SELECT PetInfo.RMac,PetInfo.Name FROM TReceiver As ReceiverInfo
03-09 07:54:51.953 6235-6235 / com.petapp.petfinder E / SQLiteLog:(1)没有这样的表:TReceiver As
所以我的代码进入Catch块创建表之前再次执行select查询,当它尝试创建表时,我收到错误:
03-09 07:54:52.378 6235-6235 / com.petapp.petfinder E / SQLiteLog:(1)表TReceiver已存在
03-09 07:54:52.603 6235-6235 / com.petapp.petfinder E / TReceiver:表TReceiver已经存在(代码1):,同时编译:CREATE TABLE TReceiver(RMac PRIMARY_KEY,Name TEXT)
我真的不明白为什么我会收到这些错误。有没有人遇到过那种问题?这是我使用的代码。提前感谢您的回复。
这是数据库管理器类:
public class DatabaseManager {
private Integer mOpenCounter = 0;
private static DatabaseManager instance;
private static SQLiteOpenHelper mDatabaseHelper;
private SQLiteDatabase mDatabase;
public static synchronized void initializeInstance(SQLiteOpenHelper helper) {
if (instance == null) {
instance = new DatabaseManager();
mDatabaseHelper = helper;
}
}
public static synchronized DatabaseManager getInstance() {
if (instance == null) {
throw new IllegalStateException(DatabaseManager.class.getSimpleName() +
" is not initialized, call initializeInstance(..) method first.");
}
return instance;
}
public synchronized SQLiteDatabase openWriteDatabase() {
mOpenCounter+=1;
if(mOpenCounter == 1) {
// Opening new database
mDatabase = mDatabaseHelper.getWritableDatabase();
}
return mDatabase;
}
public synchronized SQLiteDatabase openReadDatabase() {
mOpenCounter+=1;
if(mOpenCounter == 1) {
// Opening new database
mDatabase = mDatabaseHelper.getReadableDatabase();
}
return mDatabase;
}
public synchronized void closeDatabase() {
mOpenCounter-=1;
if(mOpenCounter == 0) {
// Closing database
mDatabase.close();
}
} }
这是DBHelper类
public class DBHelper extends SQLiteOpenHelper {
//version number to upgrade database version
//each time if you Add, Edit table, you need to change the
//version number.
private static final int DATABASE_VERSION =8;
// Database Name
private static final String DATABASE_NAME = "PFDatabase.db";
private static final String TAG = DBHelper.class.getSimpleName().toString();
public DBHelper( ) {
super(App.getContext() , DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//All necessary tables you like to create will create here
db.execSQL(TReceiverRepo.createTable());
db.execSQL(TPetInfoRepo.createTable());
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d(TAG, String.format("SQLiteDatabase.onUpgrade(%d -> %d)", oldVersion, newVersion));
// Drop table if existed, all data will be gone!!!
db.execSQL("DROP TABLE IF EXISTS " + TReceiver.TABLE);
db.execSQL("DROP TABLE IF EXISTS " + TPetInfo.TABLE);
onCreate(db);
}}
这是2个表对象定义类:
public class TPetInfo {
public static final String TAG = TPetInfo.class.getSimpleName();
public static final String TABLE = "TPetInfo";
// Labels Table Columns names
public static final String KEY_ID_Serial_Transmitter = "ID_Serial_Transmitter";
public static final String KEY_Name = "Name";
public static final String KEY_UUID = "UUID";
public String ID_Serial_Transmitter;
public String name;
public String UUID;
public String getID_Serial_Transmitter() {
return ID_Serial_Transmitter;
}
public void setID_Serial_Transmitter(String ID_Serial_Transmitter) {
this.ID_Serial_Transmitter = ID_Serial_Transmitter;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setUUID(String UUID) {
this.UUID = UUID;
}
public String getUUID() {
return UUID;
}}
public class TReceiver {
public static final String TAG = TReceiver.class.getSimpleName();
public static final String TABLE = "TReceiver";
// Labels Table Columns names
public static final String KEY_RMac = "RMac";
public static final String KEY_Name = "Name";
public String RMac;
public String name;
public String getRMac() {
return RMac;
}
public void setRMac(String RMac) {
this.RMac = RMac;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}}
在getReceiverInfo()方法的Try / catch块中发生错误的两个Object Repo类:
public class TPetInfoRepo {
private static TPetInfo TPetInfo;
private final String TAG = TPetInfo.class.getSimpleName().toString();
public TPetInfoRepo(){
TPetInfo = new TPetInfo();
}
public static String createTable(){
return "CREATE TABLE " + TPetInfo.TABLE + "("
+ TPetInfo.KEY_ID_Serial_Transmitter + " PRIMARY_KEY, "
+ TPetInfo.KEY_Name + " TEXT, "
+ TPetInfo.KEY_UUID + " TEXT )";
}
public int insert(TPetInfo tPetInfo) {
int transmiterID;
SQLiteDatabase db = DatabaseManager.getInstance().openWriteDatabase();
ContentValues values = new ContentValues();
values.put(tPetInfo.KEY_ID_Serial_Transmitter, tPetInfo.getID_Serial_Transmitter());
values.put(tPetInfo.KEY_Name, tPetInfo.getName());
values.put(tPetInfo.KEY_UUID, tPetInfo.getUUID());
// Inserting Row
transmiterID=(int)db.insert(tPetInfo.TABLE, null, values);
DatabaseManager.getInstance().closeDatabase();
return transmiterID;
}
public void delete( ) {
SQLiteDatabase db = DatabaseManager.getInstance().openWriteDatabase();
db.delete(TPetInfo.TABLE,null,null);
DatabaseManager.getInstance().closeDatabase();
}
public void updatePetInfo(TPetInfo petInfos){
SQLiteDatabase db = DatabaseManager.getInstance().openWriteDatabase();
ContentValues valeurs = new ContentValues();
valeurs.put(petInfos.KEY_ID_Serial_Transmitter, TPetInfo.getID_Serial_Transmitter());
valeurs.put(petInfos.KEY_Name, TPetInfo.getName());
valeurs.put(petInfos.KEY_UUID, TPetInfo.getUUID());
db.update(petInfos.TABLE, valeurs, petInfos.KEY_ID_Serial_Transmitter + "= ?", new String[]{String.valueOf(petInfos.ID_Serial_Transmitter)});
db.close();
}
public List<TPetInfo> getPetsInfo(){
TPetInfo TPetsInfoList = new TPetInfo();
List<TPetInfo> PetInfoList = new ArrayList<TPetInfo>();
SQLiteDatabase db = DatabaseManager.getInstance().openReadDatabase();
String selectQuery =" SELECT PetInfo." + TPetInfo.KEY_ID_Serial_Transmitter
+ ", PetInfo." + TPetInfo.KEY_Name
+ ", PetInfo." + TPetInfo.KEY_UUID
+ " FROM " + TPetInfo.TABLE + " As PetInfo "
;
Log.d(TAG, selectQuery);
try {
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
TPetsInfoList = new TPetInfo();
TPetsInfoList.setID_Serial_Transmitter(cursor.getString(cursor.getColumnIndex(TPetInfo.KEY_ID_Serial_Transmitter)));
TPetsInfoList.setName(cursor.getString(cursor.getColumnIndex(TPetInfo.KEY_Name)));
TPetsInfoList.setUUID(cursor.getString(cursor.getColumnIndex(TPetInfo.KEY_UUID)));
PetInfoList.add(TPetsInfoList);
} while (cursor.moveToNext());
}
cursor.close();
}
catch (SQLiteException e)
{
if (e.getMessage().toString().toLowerCase().contains("no such table")){
Log.e(TAG, "Creating table " + TPetInfo.TABLE + "because it doesn't exist!");
// create table
try {
db.execSQL(createTable().toString());
}
catch (SQLiteException exception){
Log.e(TAG, exception.getMessage().toString());
}
// re-run query, etc.
try {
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
TPetsInfoList = new TPetInfo();
TPetsInfoList.setID_Serial_Transmitter(cursor.getString(cursor.getColumnIndex(TPetInfo.KEY_ID_Serial_Transmitter)));
TPetsInfoList.setName(cursor.getString(cursor.getColumnIndex(TPetInfo.KEY_Name)));
TPetsInfoList.setUUID(cursor.getString(cursor.getColumnIndex(TPetInfo.KEY_UUID)));
PetInfoList.add(TPetsInfoList);
} while (cursor.moveToNext());
}
cursor.close();
}
catch (SQLiteException exception){
Log.e(TAG, exception.getMessage().toString());
}
}
}
DatabaseManager.getInstance().closeDatabase();
return PetInfoList;
}}
public class TReceiverRepo {
private static TReceiver TReceiver;
private final String TAG = TReceiver.class.getSimpleName().toString();
public TReceiverRepo(){
TReceiver = new TReceiver();
}
public static String createTable(){
return "CREATE TABLE " + TReceiver.TABLE + "("
+ TReceiver.KEY_RMac + " PRIMARY_KEY, "
+ TReceiver.KEY_Name + " TEXT ) ";
}
public int insert(TReceiver tReceiver) {
int ID;
SQLiteDatabase db = DatabaseManager.getInstance().openWriteDatabase();
ContentValues values = new ContentValues();
values.put(TReceiver.KEY_RMac, TReceiver.getRMac());
values.put(TReceiver.KEY_Name, TReceiver.getName());
// Inserting Row
ID=(int)db.insert(TReceiver.TABLE, null, values);
DatabaseManager.getInstance().closeDatabase();
return ID;
}
public void delete( ) {
SQLiteDatabase db = DatabaseManager.getInstance().openWriteDatabase();
db.delete(TReceiver.TABLE,null,null);
DatabaseManager.getInstance().closeDatabase();
}
public void updatePetInfo(TReceiver ReceiverInfos){
SQLiteDatabase db = DatabaseManager.getInstance().openWriteDatabase();
ContentValues valeurs = new ContentValues();
valeurs.put(ReceiverInfos.KEY_RMac, TReceiver.getRMac());
valeurs.put(ReceiverInfos.KEY_Name, TReceiver.getName());
db.update(ReceiverInfos.TABLE, valeurs, ReceiverInfos.KEY_RMac + "= ?", new String[]{String.valueOf(ReceiverInfos.RMac)});
db.close();
}
public List<TReceiver> getReceiverInfo(){
TReceiver TReceiverInfoList = new TReceiver();
List<TReceiver> PetInfoList = new ArrayList<TReceiver>();
SQLiteDatabase db = DatabaseManager.getInstance().openReadDatabase();
String selectQuery =" SELECT PetInfo." + TReceiver.KEY_RMac
+ ", PetInfo." + TReceiver.KEY_Name
+ " FROM " + TReceiver.TABLE + " As ReceiverInfo "
;
Log.d(TAG, selectQuery);
try {
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
TReceiverInfoList = new TReceiver();
TReceiverInfoList.setRMac(cursor.getString(cursor.getColumnIndex(TReceiver.KEY_RMac)));
TReceiverInfoList.setName(cursor.getString(cursor.getColumnIndex(TReceiver.KEY_Name)));
PetInfoList.add(TReceiverInfoList);
} while (cursor.moveToNext());
}
cursor.close();
}
catch (SQLiteException e) {
if (e.getMessage().toString().toLowerCase().contains("no such table")) {
Log.e(TAG, "Creating table " + TReceiver.TABLE + " because it doesn't exist!");
// create table
try {
db.execSQL(createTable().toString());
} catch (SQLiteException exception) {
Log.e(TAG, exception.getMessage().toString());
}
// re-run query, etc.
try {
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
TReceiverInfoList = new TReceiver();
TReceiverInfoList.setRMac(cursor.getString(cursor.getColumnIndex(TReceiver.KEY_RMac)));
TReceiverInfoList.setName(cursor.getString(cursor.getColumnIndex(TReceiver.KEY_Name)));
PetInfoList.add(TReceiverInfoList);
} while (cursor.moveToNext());
}
cursor.close();
} catch (SQLiteException exception) {
Log.e(TAG, exception.getMessage().toString());
}
}
}
DatabaseManager.getInstance().closeDatabase();
return PetInfoList;
}}
答案 0 :(得分:0)
有一些事情可能导致这种错误。
第一个,也是最常见的,它会更改应用程序数据库主体,然后运行应用程序。该操作不会更改当前数据库,每次更改时,都必须卸载应用程序,或者在再次运行之前清除数据。
但在这种情况下,我认为错误可能与语法有关。
您的桌名与&#34; As&#34;之间的空白可能存在。命令不被视为有效空格,但是有效字符,请尝试使用另一个ASCII值作为空格,如this answer中所述。
另一件事是你在表名和&#34; As&#34;之间使用了两个空格。命令,我不相信这是一个问题,但值得一试。
我最后的猜测是&#34; As&#34;语法,尝试使用始终大写的SQL命令,即使它没有解决问题,它也是一个很好的实践。