2013-09-28 100 views
-1

我想從SQLite數據庫中選擇數據,但有麻煩。 首先,我將數據庫從assets文件夾加載到data/data/PACKAGE_NAME/databases。它正確加載罰款和數據庫加載。但是,當我試圖用光標讀取數據 - 應用程序停止(這裏是我的代碼,點我的錯誤請感謝從光標的sqlite數據庫選擇數據

public class SQLiteHelper extends SQLiteAssetHelper { 

public static final String DB_NAME = "cards"; 
private static final int DATABASE_VERSION = 1; 

public static final String TABLE_CARDS = "cards"; 

public static final String COLUMN_ID = "_id"; 
public static final String COLUMN_CARD_NAME = "card_name"; 
public static final String COLUMN_TYPE = "type"; 
public static final String COLUMN_RARITY = "rarity"; 
public static final String COLUMN_CARD_CLASS = "card_class"; 
public static final String COLUMN_SET = "card_set"; 
public static final String COLUMN_RACE = "race"; 
public static final String COLUMN_SKILLS = "skills"; 
public static final String COLUMN_MANA = "mana"; 
public static final String COLUMN_ATTACK = "attack"; 
public static final String COLUMN_HEALTH = "health"; 
public static final String COLUMN_DAMAGE = "damage"; 
public static final String COLUMN_DURABILITY = "durability"; 
public static final String COLUMN_CRAFT = "craft"; 
public static final String COLUMN_DUST = "dust"; 
public static final String COLUMN_ARTIST = "artist"; 
public static final String COLUMN_EXTRA_INFO = "extra_info"; 
public static final String COLUMN_CARD_SRC = "card_src"; 


public SQLiteHelper(Context context) { 
    super(context, DB_NAME, null, DATABASE_VERSION); 
} 

public List<FullCard> getCards() { 

    SQLiteDatabase db = getReadableDatabase(); 

    //I want to record all selected data to this list 
    List<FullCard> cards = new ArrayList<FullCard>(); 

    Cursor cursor = db.query(SQLiteHelper.TABLE_CARDS, 
      null, null, null, null, null, null); 

    cursor.moveToFirst(); 
    while (!cursor.isAfterLast()) { 
     FullCard card = cursorToCard(cursor); 
     cards.add(card); 
     cursor.moveToNext(); 
    } 
    cursor.close(); 
    return cards; 
} 
private FullCard cursorToCard(Cursor cursor) { 
    FullCard card = new FullCard(); 
    card.setId(cursor.getInt(0)); 
    card.setCardName(cursor.getString(1)); 
    card.setType(cursor.getString(2)); 
    card.setRarity(cursor.getString(3)); 
    card.setCardClass(cursor.getString(4)); 
    card.setSet(cursor.getString(5)); 
    card.setRace(cursor.getString(6)); 
    card.setSkills(cursor.getString(7)); 
    card.setMana(cursor.getString(8)); 
    card.setAttack(cursor.getString(9)); 
    card.setHealth(cursor.getString(10)); 
    card.setDamage(cursor.getString(11)); 
    card.setDurability(cursor.getString(12)); 
    card.setCraft(cursor.getString(13)); 
    card.setDust(cursor.getString(14)); 
    card.setArtist(cursor.getString(15)); 
    card.setExtraInfo(cursor.getString(16)); 
    card.setCard_src(cursor.getString(17)); 
    return card; 
} 

}

類的片段,其中i調用方法getCards(。 ),它引起應用程序崩潰

public class ActivityDB extends ListActivity implements View.OnClickListener{ 

private SQLiteHelper datasource; 
private static Parcelable state; 
private static ListView lv; 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    setContentView(R.layout.activity_db); 

    Button button_filters = (Button)findViewById(R.id.button_filters); 
    Button button_menu = (Button)findViewById(R.id.button_menu); 
    button_filters.setOnClickListener(this); 
    button_menu.setOnClickListener(this); 

    ListItem listItem; 
    ArrayList<ListItem> listItems = new ArrayList<ListItem>(); 

    datasource = new SQLiteHelper(this); 
    List<FullCard> dbCardList = datasource.getCards(); // Here is that method 

    for (FullCard aDbCardList : dbCardList) { 
     listItem = new ListItem(); 
     listItem.setTitle(aDbCardList.getCardName()); 
     listItem.setPar1(aDbCardList.getMana()); 
     listItem.setPar2(aDbCardList.getAttack()); 
     listItem.setPar3(aDbCardList.getHealth()); 
     listItems.add(listItem); 
    } 

    setListAdapter(new ListItemAdapter(this,listItems)); 

}

這裏是logcat的錯誤:
1月9日至29日:54:11.989 I/SQLiteAssetHelper(15846):■ uccessfully打開的數據庫卡 1月9日至29日:54:12.049 W/dalvikvm(15846):線程ID = 1:螺紋與未捕獲的異常(組= 0x40018578)離開 1月9日至29日:54:12.069 E/AndroidRuntime(15846):致命例外:main 09-29 01:54:12.069 E/AndroidRuntime(15846):java.lang.RuntimeException:無法啓動活動ComponentInfo {com.FHS/com.FHS.ActivityDB}:android.database.sqlite.SQLiteException :未知錯誤:無法BLOB轉換爲字符串 一月9日至29日:54:12.069 E/AndroidRuntime(15846):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651) 一月9日至29日:54:12.069 E/AndroidRuntime(15846):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 09-29 01:54:12.069 E/AndroidRuntime(15846):at android.app.ActivityThread.access $ 1500(ActivityThread。 java:117) 09-29 01:54:12.069 E/AndroidRuntime(15846):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:935) 09-29 01:54:12.069 E/AndroidRuntime(15846):at android.os.Handler.dispatchMessage(Handler.java:99) 1月9日至29日:54:12.069 E/AndroidRuntime(15846):在android.os.Looper.loop(Looper.java:130) 1月9日至29日:54:12.069 E/AndroidRuntime(15846):at android.app.ActivityThread.main(ActivityThread.java:3687) 09-29 01:54:12.069 E/AndroidRuntime(15846):at java.lang.reflect.Method .invokeNative(本機方法) 1月9日至29日:54:12.069 E/AndroidRuntime(15846):在java.lang.reflect.Method.invoke(Method.java:507) 1月9日至29日:54:12.069 E/AndroidRuntime(15846):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:867) 09-29 01:54:12.069 E/A ndroidRuntime(15846):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 09-29 01:54:12.069 E/AndroidRuntime(15846):at dalvik.system.NativeStart.main(Native法) 1月9日至29日:54:12.069 E/AndroidRuntime(15846):android.database.sqlite.SQLiteException:由造成未知錯誤:無法BLOB轉換爲字符串 1月9日至29日:54:12.069 E/AndroidRuntime (15846):在android.database.CursorWindow.getString_native(本機方法) 1月9日至29日:54:12.069 E/AndroidRuntime(15846):在android.database.CursorWindow.getString(CursorWindow.java:361) 09- 29 01:54:12.069 E/AndroidRuntime(15846):在android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:49) 1月9日至29日:54:12.069 E/AndroidRuntime(15846):在com.FHS.SQLiteHelper .cursorToCard(SQLiteHelper.java:84) 1月9日至29日:54:12.069 E/AndroidRuntime(15846):在com.FHS.SQLiteHelper.getCards(SQLiteHelper.java:73) 1月9日至29日:54:12.069 E/AndroidRuntime(15846):在COM。 FHS.ActivityDB.onCreate(ActivityDB.java:65) 09-29 01:54:12.069 E/AndroidRuntime(15846):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 09-29 1時54 :12.069 E/AndroidRuntime(15846):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 1月9日至29日:54:12.069 E/AndroidRuntime(15846):...11更多 09-29 01:54:23.589 W/InputManagerService(207):有RemoteException發送setActive(false)通知給pid 15846 uid 10062

+0

請分享您的logcat錯誤。 – epiphany27

+0

@PushkarPandey用logcat編輯帖子,它表示無法將BLOB轉換爲字符串 –

回答

0

對不起,忘記最後一個答案。再次閱讀後,我看到我錯了。有一個在你的logcat的一條線,說:

E/AndroidRuntime(15846): Caused by: android.database.sqlite.SQLiteException: unknown error: Unable to convert BLOB to string 09-29 01:54:12.069 E/AndroidRuntime(15846): at android.database.CursorWindow.getString_native(Native Method) 09-29 01:54:12.069 

你有定義了一些列的BLOB?


`SQLiteHelper.TABLE_CARDS`應該在`SQliteDatabase.query)的第二個參數(`,而不是第一: 公共光標查詢(字符串表,字符串[]欄,串選擇,字符串[] selectionArgs,String groupBy,String having,String orderBy)
+0

em ... TABLE_CARDS表示數據庫中的表名,因此,根據上面的代碼,表名應該是第一個。我對嗎? –

+0

不,_id列定義爲整型主鍵,其他所有列都是文本。一些字段爲空。 –

+0

問題解決。數據庫存在一個問題。一些字符串填充(數據),並且它是個例外。 –