2011-08-10 8 views
1

나는 처음으로 안드로이드에서 sqlite 데이터베이스로 작업하고있다. 나는 Sqlite 내 데이터베이스를 만들고 안드로이드에 복사 "data/data/App package/databases" 있습니다. 데이터베이스를 복사하고 열 수 있습니다. 나는 데이터베이스에 4 개의 테이블을 갖고 있는데, "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. 답장을 보내 주셔서 감사합니다, 죄송합니다. 데이터베이스에 대해 nullpointer를 얻지 못하고 있습니다. 하지만 내 stateNameArray에서 "State_Name (열 이름) 문자열을 데이터베이스 데이터 클래스 대신 String 데이터로 언급합니다"대신 데이터를 가져옵니다. – Piyush

+0

미안하지만 질문을 잘못 읽었습니다! 그 줄은 무엇입니까?'stateNameArray = new String [] LoveGodDB.STATE_NAME'은 무엇을 의미합니까? – Pikaling

답변

2

stateNameArray = new String[]LoveGodDB.STATE_NAME 

시도를 변경하는 것 :

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

답변 :

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

그런 다음 당신은 문자열 배열에 커서의 상태 이름을 둘 필요가이 줄을 이해하지 에서 적응 : 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)); 
} 
관련 문제