开发者

Getting SQLiteContraintException in Android database

I'm getting a constraint failed exception in my Android project, and I can't quite figure out where it's coming from. My helper class looks like this:

    public static final String WORDS_TABLE = "words";
public static final String ATT_WORD = "word";
public static final String ATT_T1 = "T1";
public static final String ATT_T2 = "T2";
public static final String ATT_T3 = "T3";
public static final String ATT_T4 = "T4";
public static final String ATT_T5 = "T5";
public static final String ATT_RECENT = "recent";
public static final Strin开发者_JS百科g ATT_RATING = "rating";

public static final String STATISTICS_TABLE = "statistics";
public static final String ATT_GAMESPLAYED = "gamesPlayed";
public static final String ATT_wordsCORRECT = "wordsCorrect";
public static final String ATT_wordsWRONG = "wordsWrong";
public static final String ATT_POINTTOTAL = "pointTotal";
public static final String ATT_WINS = "wins";
public static final String ATT_LOSSES = "losses";

public static final String SETTING_TABLE = "settings";
public static final String ATT_SID = "sid";
public static final String ATT_TYPE = "type";
public static final String ATT_DURATION = "duration";
public static final String ATT_PTSTOWIN = "ptsToWin";

public static final String CATEGORIES_TABLE = "categories";
public static final String ATT_CATEGORY = "category";

public static final String BELONGS_TABLE = "belongs";

public static final String USER_TABLE = "user";
public static final String ATT_UID = "uid";

public static final String DATABASE_NAME = "taboo";
private static final int DATABASE_VERSION = 1;
private static final String TAG = "DBAdapter";

private static final String WORDS_CREATE =
    "create table words (_id primary key autoincrement, word text, "
    + "T1 text, T2 text, T3 text, T4 text, T5 text, "
    + "recent integer, rating integer);";

private static final String CATEGORIES_CREATE =
    "create table categories (_id integer primary key autoincrement, category text unique);";

private static final String BELONGS_CREATE =    
    "create table belongs (_id integer primary key autoincrement, word text, category text, "
    + "foreign key (word) references words (word), foreign key (category) references categories (category));";

private static final String USER_CREATE =
    "create table user (_id integer primary key autoincrement, uid text unique);";

private static final String STATISTICS_CREATE =   
    "create table statistics (_id integer primary key  autoincrement, uid text unique, gamesPlayed integer, wordsCorrect integer, "
    +"wordsWrong integer, pointTotal integer, wins integer, losses integer, "
    +"foreign key (uid) references user (uid));";

private static final String SETTINGS_CREATE =
    "create table settings (_id integer primary key autoincrement, uid text, sid text, "
    +"type text, duration integer, ptsToWin integer, "
    +"foreign key (uid) references user (uid));"
    ;


//**************************************************************
//*********************  Function Constants ********************
//**************************************************************

private final Context context; 
private DatabaseHelper DBHelper;
public static SQLiteDatabase db;
private int wordCount = 100;

//********************  Object 
public DBAdapter(Context ctx) 
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper 
{
    DatabaseHelper(Context context) 
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        db.execSQL(WORDS_CREATE);
        db.execSQL(CATEGORIES_CREATE);
        db.execSQL(BELONGS_CREATE);
        db.execSQL(USER_CREATE);
        db.execSQL(STATISTICS_CREATE);
        db.execSQL(SETTINGS_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, 
                          int newVersion) 
    {
        Log.w(TAG, "Upgrading database from version " + oldVersion 
              + " to "
              + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS " + WORDS_TABLE);
        onCreate(db);
    }
}    

//****************************************************
//********  Database Functions  **********************
//****************************************************

public DBAdapter open() throws SQLException 
{
    db = DBHelper.getWritableDatabase();
    return this;
} 
public void close() 
{
    DBHelper.close();
}

The population of my database table 'words' used JExcelAPI to scan from an excel spreadsheet the data to be entered. The populate method looks like this:

public void WordPopulate(Context ctx) throws SQLException, BiffException, IOException
{
    Workbook wb = null;
    AssetManager asst = ctx.getAssets();

    wb = Workbook.getWorkbook(asst.open("words.xls"));

    ContentValues content = new ContentValues();
    Sheet sh = wb.getSheet(0);
    final int rows = sh.getRows() - 1;
    final int columns = sh.getColumns() - 1;

    Cell a1;
    for (int i = 1; i <= rows; i++) {
            for (int j = 1; j <= columns; j++) {
                a1 = sh.getCell(j,i);
                String str = a1.getContents();
                if (j == 1) content.put(DBAdapter.ATT_WORD, str);
                if (j == 2) content.put(DBAdapter.ATT_T1, str);
                if (j == 3) content.put(DBAdapter.ATT_T2, str);
                if (j == 4) content.put(DBAdapter.ATT_T3, str);
                if (j == 5) content.put(DBAdapter.ATT_T4, str);
                if (j == 6) content.put(DBAdapter.ATT_T5, str);
                if (j == 7) content.put(DBAdapter.ATT_RECENT, (int)0);
                if (j == 8) content.put(DBAdapter.ATT_RATING, (int)0);
            }
            DBAdapter.db.insert(DBAdapter.WORDS_TABLE, "NULL", content);
        }
    }

I think all of the data in the spreadsheet is ok. Does anyone have any ideas on what would cause the SQLiteConstraintException? Thanks for the time


Your code

private static final String WORDS_CREATE =
    "create table words (_id primary key autoincrement, word text, "
    + "T1 text, T2 text, T3 text, T4 text, T5 text, "
    + "recent integer, rating integer);";

should be

private static final String WORDS_CREATE =
    "create table words (_id integer primary key autoincrement, word text, "
    + "T1 text, T2 text, T3 text, T4 text, T5 text, "
    + "recent integer, rating integer);";

Correction is "_id integer primary key".

Not an error, but for consistency, I think this

private static final String SETTINGS_CREATE =
    "create table settings (_id integer primary key autoincrement, uid text, sid text, "
    +"type text, duration integer, ptsToWin integer, "
    +"foreign key (uid) references user (uid));"
    ;

should be

private static final String SETTINGS_CREATE =
    "create table settings (_id integer primary key autoincrement, uid text, sid text, "
    +"type text, duration integer, ptsToWin integer, "
    +"foreign key (uid) references user (uid));";

Change is position of final semicolon.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜