App只是被迫退出,可能与SQLite有关

时间:2012-09-16 01:23:18

标签: android android-sqlite

我尝试使用SQLite支持创建应用程序。 但是当我启动应用程序时,它只是冻结,不得不被迫退出。 Main.java类:

package se.maxallan.birdsound;

import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class Main extends Activity {
private SpeciesDbAdapter dbHelper;
private SimpleCursorAdapter dataAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    dbHelper = new SpeciesDbAdapter(this);
    dbHelper.open();

    dbHelper.insertSomeSpecies();
    displayListView();


}
private void displayListView() {
    Cursor cursor = dbHelper.fetchAllSpecies();

    String[] columns = new String[]{
        SpeciesDbAdapter.DB_SCF_NAME,
        SpeciesDbAdapter.DB_T_TRANS
    };
    int[] to = new int[]{
        R.id.scf,
        R.id.trans
    };
    dataAdapter = new SimpleCursorAdapter(this,R.layout.specierow,cursor,columns,to);
     ListView listView = (ListView) findViewById(R.id.specieList);
      // Assign adapter to ListView
     listView.setAdapter(dataAdapter);
}

}

我认为错误位于此类中,名为SpeciesDbAdapter.java

    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;

private static String DB_CREATE = 
"CREATE TABLE if not exists species ("+DB_SPECIE_ID +" integer PRIMARY KEY autoincrement, "+DB_SCF_NAME+" , UNIQUE ("+DB_SPECIE_ID +"));" +
"CREATE TABLE if not exists translations (tid integer PRIMARY KEY autoincrement, "+DB_SPECIE_ID +" integer, "+DB_T_TRANS+", "+DB_T_LANG+", UNIQUE ( tid ));";

public SpeciesDbAdapter(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
    this.mCtx = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
    Log.w("DATABAS", DB_CREATE);
    db.execSQL(DB_CREATE);
}
@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.query(DB_TBL_SPECIES, new String[] {DB_SPECIE_ID, DB_SCF_NAME},null, null, null, null, null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}
public void insertSomeSpecies() {
    addSpecie("Cygnus olor", "Knölsvan", "sv");
    addSpecie("Cygnus cygnus", "Sångsvan", "sv");
}

}

我想我只是误解了一些东西。 而且CatLog根本没有提供任何日志......

2 个答案:

答案 0 :(得分:0)

问题是你是从一个变量执行两个create sql语句,试试这个,

String createSpecies = "CREATE TABLE if not exists species ("+DB_SPECIE_ID +" integer PRIMARY KEY autoincrement, "+DB_SCF_NAME+" , UNIQUE ("+DB_SPECIE_ID +"));" 
String createTranslations = "CREATE TABLE if not exists translations (tid integer PRIMARY KEY autoincrement, "+DB_SPECIE_ID +" integer, "+DB_T_TRANS+", "+DB_T_LANG+", UNIQUE ( tid ));";

@Override
public void onCreate(SQLiteDatabase db) 
{
    Log.w("DATABAS", DB_CREATE);
    db.execSQL(createSpecies);
    db.execSQL(createTranslations);
}

答案 1 :(得分:0)

    String[] columns = new String[]{
    SpeciesDbAdapter.DB_SCF_NAME,
    SpeciesDbAdapter.DB_T_TRANS }

您查询两个表,但columns应该在一个表中。