2011-08-10 125 views
1

我與SQLite數據庫在Android平臺的第一次。我已經在Sqlite中創建了我的數據庫,並將其複製到androids "data/data/App package/databases"。我能夠複製和打開數據庫。我在數據庫中有四張表,我想要"State_Name(Column)" from "State_Master(Table)"如何從ANDROID中的sqlite數據庫獲取列數據?

,但我無法從表中獲取任何數據(國家名稱)。

這裏我發表我的代碼:

//DataBase Helper 

public class DatabaseHelper extends SQLiteOpenHelper { 

private String[] stateArray; 
private Context context; 
private String DB_PATH; 
private static String DB_NAME = "myDatabase.sqlite"; 
public static SQLiteDatabase myDatabase; 
public static final String STATE_NAME = "State_Name"; 

public LoveGodDB(Context context) throws Exception { 
    super(context, DB_NAME, null, 1); 
    this.context = context; 
    DB_PATH = "/data/data/" + context.getApplicationContext().getPackageName() + "/databases/"; 
    boolean dbexist = checkdatabase(); 
    if (dbexist) { 
     opendatabase(); 
    } else { 
     createdatabase(); 
    } 

} 
@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(STATE_NAME); 
} 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

} 
public void createdatabase() throws Exception { 
    boolean dbexist = checkdatabase(); 
    if (dbexist) { 
    } else { 
     this.getReadableDatabase(); 
     try { 
      copydatabase(); 
     } catch (IOException e) { 
      throw new Error("Error copying database"); 
     } 
    } 
} 
private boolean checkdatabase() throws Exception { 
    boolean checkdb = false; 
    try { 
     String myPath = DB_PATH + DB_NAME; 
     File dbfile = new File(myPath); 
     checkdb = dbfile.exists(); 
    } catch (SQLiteException sle) { 
     throw sle; 
    } 
    return checkdb; 
} 
private void copydatabase() throws IOException { 

    InputStream myinput = context.getApplicationContext().getAssets().open(DB_NAME); 
    OutputStream myoutput = new FileOutputStream("/data/data/"+ context.getApplicationContext().getPackageName() +"/databases/myDataBase.sqlite"); 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myinput.read(buffer)) > 0) { 
     myoutput.write(buffer, 0, length); 
    } 

    myoutput.flush(); 
    myoutput.close(); 
    myinput.close(); 
} 
public void opendatabase() throws SQLException { 
    String mypath = DB_PATH + DB_NAME; 
    LGDataBase = SQLiteDatabase.openDatabase(mypath, null, 
      SQLiteDatabase.OPEN_READWRITE); 

} 
public synchronized void close() { 
    if (LGDataBase != null) { 
     LGDataBase.close(); 
    } 
    super.close(); 
} 
public Cursor fetchAllTopics() { 

    return LGDataBase.query("State_Master", new String[] {STATE_NAME}, 
      null, 
      null, 
      null, 
      null, 
      null); 
}; 


} 

}

和我的活動,我想將數據存儲在字符串數組:

public class MyStateGrid extends Activity{ 

private Button back; 
private String[] stateNameArray ; 
private GridView gridview = null; 
private DatabaseHelper lgDB; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.errandboy_state); 

    back = (Button) findViewById(R.id.back); 
    gridview = (GridView) findViewById(R.id.gridview); 
    gridview.setAdapter(new ImageAdapter(this)); 

    //stateNameArray = getResources().getStringArray(R.array.stateName); 
    try { 
     lgDB = new LoveGodDB(this); 
     lgDB.opendatabase(); 
     Cursor c = lgDB.fetchAllTopics(); 
        startManagingCursor(c); 
     stateNameArray = new String[]LoveGodDB.STATE_NAME}; 
    } catch (IOException e) { 

    } catch (Exception e) { 

    }finally{ 
     if(lgDB != null){ 
      lgDB.close(); 
     } 
    } 

    gridview.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      Intent stamp = new Intent(getParent(), xxxx.class); 
      TabGroupActivity parentActivity = (TabGroupActivity)getParent(); 
      parentActivity.startChildActivity("Stamp", stamp); 

     } 
    }); 

    OnTouchListener backListener = new OnTouchListener() { 
     public boolean onTouch (View v, MotionEvent event) { 
      if (event.getAction()==MotionEvent.ACTION_UP){ 
       finish(); 
      } 
      return false; 
     } 
    }; 

    back.setOnTouchListener(backListener); 
} 
public class ImageAdapter extends BaseAdapter { 
    @SuppressWarnings("unused") 
    private Context mContext; 

    public ImageAdapter(Context c) { 
     mContext = c; 
    } 

    public int getCount() { 
     return stateImageArray.length; 
    } 

    public Object getItem(int position) { 
     return null; 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.galchild, null); 
     ImageView stampImage; 
     TextView stampName; 
     stampImage = (ImageView) v.findViewById(R.id.ImageView01); 
     stampName = (TextView) v.findViewById(R.id.stampName); 
     stampImage.setScaleType(ImageView.ScaleType.FIT_XY); 
     stampImage.setImageResource(R.drawable.stamps); 
     stampName.setText(stateNameArray[position]); 
     return v; 
    } 
} 

}

什麼建議嗎?

謝謝...

+0

你可以張貼展示NullPointerException異常的logcat的輸出? – Pikaling

+0

@vicki。感謝您的回覆,我很抱歉,我沒有收到空指針數據庫。但在我stateNameArray我只是「State_Name(列名稱)字符串,我提到作爲一個字符串在databaseHelper類」而不是列數據。 – Piyush

+0

對不起,我誤解了這個問題!什麼是行:'stateNameArray = new String [] LoveGodDB.STATE_NAME'意味着什麼? – Pikaling

回答

2

我做不明白這行:

stateNameArray = new String[]LoveGodDB.STATE_NAME 

嘗試改變它:

stateNameArray = new String[c.count()]; 

然後,你需要把狀態的名字在光標移動到字符串數組:

int i = 0; 
c.moveToFirst(); 
while (c.isAfterLast() == false) { 
    statNameArray[i] = c.getString(0); 
    i++; 
    c.moveToNext(); 
} 

回答改編自:Iterate through rows from Sqlite-query

+0

謝謝,現在它的工作.. – Piyush

+0

很高興能幫助:) – Pikaling

+1

熬過數列中的值,而不是好主意 – user1755546

0

如何:

return LGDataBase.rawquery("select STATE_NAME from State_Master", null); 

UPDATE

您可能需要遍歷光標把所有的值出一個這樣的數組:How can I create a list Array with the cursor data in Android

ArrayList<WhateverTypeYouWant> mArrayList = new ArrayList<WhateverTypeYouWant>(); 
for(mCursor.moveToFirst(); mCursor.moveToNext(); mCursor.isAfterLast()) { 
    // The Cursor is now set to the right position 
    mArrayList.add(mCursor.getWhateverTypeYouWant(WHATEVER_COLUMN_INDEX_YOU_WANT)); 
} 
相關問題