Android SQLite在运行期间在创建时已存在错误且在创建时已存在错误

时间:2017-03-13 11:45:49

标签: android database sqlite

我是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;
}}

1 个答案:

答案 0 :(得分:0)

有一些事情可能导致这种错误。

第一个,也是最常见的,它会更改应用程序数据库主体,然后运行应用程序。该操作不会更改当前数据库,每次更改时,都必须卸载应用程序,或者在再次运行之前清除数据。

但在这种情况下,我认为错误可能与语法有关。

您的桌名与&#34; As&#34;之间的空白可能存在。命令不被视为有效空格,但是有效字符,请尝试使用另一个ASCII值作为空格,如this answer中所述。

另一件事是你在表名和&#34; As&#34;之间使用了两个空格。命令,我不相信这是一个问题,但值得一试。

我最后的猜测是&#34; As&#34;语法,尝试使用始终大写的SQL命令,即使它没有解决问题,它也是一个很好的实践。