0

我仍然对 Java 和 Android 开发很陌生。但是在这部分中,我找不到问题所在。LogCat 返回“没有这样的表:翻译”。

package se.maxallan.birdsound;

    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;

    public class SpeciesDbAdapter extends SQLiteOpenHelper{
    public static final String DB_SPECIE_ID = "_id";
    public static final String DB_SCF_NAME = "scf_name";

    public static final String DB_T_LANG = "lang";
    public static final String DB_T_TRANS = "translated";

    private static SpeciesDbAdapter mDbHelp;
    private static SQLiteDatabase mDb;

    private static final String DB_NAME = "database.db";
    private static final String DB_TBL_SPECIES = "species";
    private static final String DB_TBL_TRANSLATIONS = "translations";
    //private static final String DB_TBL_SOUNDS = "sounds";
    private static final int DB_VERSION = 1;

    private final Context mCtx;

    static String createSpecies = "CREATE TABLE if not exists "
    + DB_TBL_SPECIES 
    +" ("+DB_SPECIE_ID +" INTEGER PRIMARY KEY AUTOINCREMENT,"
    +DB_SCF_NAME+");"; 

    static String createTranslations = "CREATE TABLE if not exists "
    + DB_TBL_TRANSLATIONS
    +" (tid INTEGER PRIMARY KEY AUTOINCREMENT,"
    +DB_SPECIE_ID+","
    +DB_T_TRANS+","
    +DB_T_LANG+");"; //The error is here?

    public SpeciesDbAdapter(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        this.mCtx = context;
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(createSpecies);
        db.execSQL(createTranslations);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

    //Open the database
    public SpeciesDbAdapter open() throws SQLException {
        mDbHelp = new SpeciesDbAdapter(mCtx);
        mDb = mDbHelp.getWritableDatabase();
        return this;
    }
    //Close the connection
    public void close() {
        if (mDbHelp != null) {
            mDbHelp.close();
        }
    }

    public void addSpecie(String scf, String translation, String lang){
        ContentValues specieValues = new ContentValues();
        ContentValues translationsValues = new ContentValues();
        specieValues.put(DB_SCF_NAME, scf);
        int LastInsertedId = (int) mDb.insert(DB_TBL_SPECIES, null, specieValues);
        translationsValues.put(DB_T_LANG, lang);
        translationsValues.put(DB_T_TRANS, translation);
        translationsValues.put(DB_SPECIE_ID, LastInsertedId);
        mDb.insert(DB_TBL_TRANSLATIONS, null, translationsValues);
    }

    public Cursor fetchAllSpecies() {
        Cursor mCursor = mDb.rawQuery("select * from "+ DB_TBL_SPECIES +" s inner join "+ DB_TBL_TRANSLATIONS +" t on s._id=t._id", null);
        Log.d("Database", "Result cursor size " + mCursor.getCount() );
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }
    public void insertSomeSpecies() {
        addSpecie("Cygnus olor", "Knölsvan", "sv");
        addSpecie("Cygnus cygnus", "Sångsvan", "sv");
    }

    }

我认为错误是我创建表translations- 或尝试创建......

4

2 回答 2

3

我猜你至少用一张桌子运行了你的应用程序:

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(createSpecies);
}

然后你补充说:

    db.execSQL(createTranslations);

OpenHelper 不会自动检查此处的任何更改。您必须强制重新创建数据库。我认为最简单的方法是增加你的DB_VERSION.

private static final int DB_VERSION = 2;

这将运行onUpgrade()应该删除现有模式并创建新模式。

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + DB_TBL_SPECIES);
    db.execSQL("DROP TABLE IF EXISTS " + DB_TBL_TRANSLATIONS);
    onCreate(db);
}

下次更改架构时,只需更改一个数字 ( DB_VERSION = 3) 即可构建新表。

于 2012-09-19T19:02:57.480 回答
2

从终端删除您的数据库

adb shell
cd /data/data/com.example.apploicationname/databases
rm *

我认为这也会对您有所帮助,而不是更改 DB_VERSION

于 2013-11-22T15:48:50.090 回答