2014-05-22 30 views
0

我在我的数据库中建立了一个新表。我有其他现有的表格可以正常工作,但是这个最新的表格稍后出现,并且证明存在问题。表没有名为[variable]的列?

问题表是酒吧桌。我从SQLite数据库浏览器中检查了数据库的结构,并看到了我期望的列。似乎有3种可能性。

1)数据库没有正确创建 - 但我可以看到列,所以我认为这不太可能?

2)我的输入法有一个问题 - 我为其他表实现了类似的方法。

3)与升级我的数据库版本

我已经截断许多代码只能隔离的重要组成部分的问题。

public class DBmanager { 

private static final String DATABASE_NAME = "DBmanagerdb"; 
private static final int DATABASE_VERSION = 1; 

// Shared strings and main table 
private static final String DATABASE_TABLE = "drinkTable"; 
public static final String KEY_ROWID = "_id"; 
public static final String KEY_NAME = "drink_name"; 
public static final String KEY_BAR = "bar_name"; 
public static final String KEY_SCORE = "drink_score"; 
public static final String KEY_VOL = "volume"; 
public static final String KEY_PRICE = "price"; 
public static final String KEY_DRINKABV = "abv"; 
public static final String KEY_FAVE = "favorite"; 
public static final String MYTAB_DRINKCOUNT = "mytab_drinkCount"; 

// Strings for ABV 
private static final String ABV_TABLE = "abvTable"; 
public static final String KEY_ABV_ID = "_id"; 
public static final String KEY_NAME_ABV = KEY_NAME; 
public static final String KEY_ABV = "abv_value"; 

// 
private static final String VERSION_TABLE = "versionTable"; 
public static final String VERSION_NUMBER = "version"; 

private static final String BAR_TABLE = "barTable"; 
private static final String KEY_LAT = "barLatitude"; 
private static final String KEY_LONG = "barLongitude"; 
public static final String KEY_BARID = "barId"; 

// Strings for My Tab 

; 

private DbHelper ourHelper; 
private final Context ourContext; 
private SQLiteDatabase ourDatabase; 

private static class DbHelper extends SQLiteOpenHelper { 

    public DbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 

     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID 
       + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_BAR 
       + " TEXT NOT NULL, " + KEY_NAME + " TEXT NOT NULL, " 
       + KEY_PRICE + " DOUBLE, " + KEY_VOL + " DOUBLE, " 
       + KEY_DRINKABV + " DOUBLE, " + KEY_SCORE + " DOUBLE," 
       + MYTAB_DRINKCOUNT + " INTEGER," + KEY_FAVE + " INTEGER);"); 

     db.execSQL("CREATE TABLE " + ABV_TABLE + " (" + KEY_ABV_ID 
       + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_NAME_ABV 
       + " TEXT NOT NULL, " + KEY_ABV + " DOUBLE);"); 

     db.execSQL("CREATE TABLE " + VERSION_TABLE + " (" + KEY_ROWID 
       + " INTEGER PRIMARY KEY AUTOINCREMENT, " + VERSION_NUMBER 
       + " INTEGER);"); 

     db.execSQL("CREATE TABLE " + BAR_TABLE + " (" + KEY_ROWID 
       + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_BAR 
       + " TEXT NOT NULL, " + KEY_LAT + " TEXT NOT NULL, " + KEY_LONG 
       + " TEXT NOT NULL);"); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     newVersion = oldVersion; 
     Log.i("Values", "OldVersion: " + oldVersion + "  New Version: " 
       + newVersion); 

     db.execSQL("DROP TABLE IF EXISTS " + BAR_TABLE); 
     onCreate(db); 

    } 

} 

public long enterNewBar(String barName) { 

    ContentValues cv = new ContentValues(); 
    cv.put(KEY_BAR, barName); 
    cv.put(KEY_LAT, "hello"); 
    cv.put(KEY_LONG, "world"); 
    return ourDatabase.insert(DATABASE_TABLE, null, cv); 
} 

public boolean checkUniqueBar(String barName) { 

    boolean flag = false; 

    String myQuery = "SELECT DISTINCT " + KEY_BAR + " FROM " 
      + DATABASE_TABLE; 

    Cursor c = ourDatabase.rawQuery(myQuery, null); 
    if (c != null) { 

     for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 
      if (c.getString(c.getColumnIndex(KEY_BAR)) == barName) { 
       flag = true; 

      } 
     } 
     c.close(); 

    } 
    return flag; 
} 

堆栈跟踪:

05-22 00:53:56.859: E/SQLiteLog(8496): (1) table drinkTable has no column named barLongitude 
    05-22 00:53:56.909: E/SQLiteDatabase(8496): Error inserting barLongitude=world barLatitude=hello bar_name=TEst 
    05-22 00:53:56.909: E/SQLiteDatabase(8496): android.database.sqlite.SQLiteException: table drinkTable has no column named barLongitude (code 1): , while compiling: INSERT INTO drinkTable(barLongitude,barLatitude,bar_name) VALUES (?,?,?) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at mjd.mdflip.areyoudrunk.DBmanager.enterNewBar(DBmanager.java:555) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at mjd.mdflip.areyoudrunk.fragments.MainFrag.calculateScore(MainFrag.java:288) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at mjd.mdflip.areyoudrunk.fragments.MainFrag.onClick(MainFrag.java:145) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at android.view.View.performClick(View.java:4204) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at android.view.View$PerformClick.run(View.java:17355) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at android.os.Handler.handleCallback(Handler.java:725) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at android.os.Handler.dispatchMessage(Handler.java:92) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at android.os.Looper.loop(Looper.java:137) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at java.lang.reflect.Method.invokeNative(Native Method) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at java.lang.reflect.Method.invoke(Method.java:511) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
    05-22 00:53:56.909: E/SQLiteDatabase(8496):  at dalvik.system.NativeStart.main(Native Method) 
+0

有什么错误?你有完整的堆栈跟踪吗? –

+1

不相关,但:'c.getString(c.getColumnIndex(KEY_BAR))== barName'不起作用。你应该使用'equals()'来代替。 – matiash

+0

尝试一次创建所有表格以及它们的列。这可能有帮助。 – artist

回答

1

要插入的drinkTable,不barTable

变化

return ourDatabase.insert(DATABASE_TABLE, null, cv); 

return ourDatabase.insert(BAR_TABLE, null, cv); 

一种更好的方式来写你的方法是:

public boolean checkUniqueBar(String barName) { 

    boolean flag = false; 

    String myQuery = "SELECT COUNT(*) " FROM " 
      + DATABASE_TABLE + " WHERE " + KEY_BAR + "=?"; 

    Cursor c = ourDatabase.rawQuery(myQuery, new String[] { barName }); 
    if (c != null) { 
     c.moveToFirst(); 
     if(c.getInteger(0) > 0) 
      flag = true; 

     c.close(); 

    } 
    return flag; 
} 
+0

非常感谢!我猜这个问题很久以来让我想起了我可能使用错误的桌子的事实。 我也改变了我的方法,你有什么。正如我早些时候说的那样,这种方法很快就被抛在了一起,但你的确看起来更好。 –

+0

当然可以。我已经查看过两次你的代码,但是它使用logcat来查看它。至于改进'checkUniqueBar()'方法,我希望尽可能减少交换的数据量。您不必亲自走动桌面,而是让SQLite完成工作并检查结果。 – 323go

相关问题