2012-01-01 5 views
1

앞서 나는이 question (그리고 일부 인터넷 검색 후 나는 모든을 잡기 위해 내가해야 할 일은. 나는 2 열 (_id 따옴표)를 포함하는 간단한 데이터베이스를 가지고, 그래서 자신의 SQLite database for Android app.sqlite에서 열을 검색하여 배열에 저장하는 방법은 무엇입니까?

입니다 사용하여 읽기 요청 DB를에서 따옴표와 텍스트 뷰에 1 그들에게 일을 보여

을 내 DataBaseHelper.java이 있습니다.?

private SQLiteDatabase myDataBase; 
public void openDataBase() throws SQLException{ 

    //Open the database 
    String myPath = DB_PATH + DB_NAME; 
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
    Cursor mCursor = myDataBase.query(true, DB_NAME, null, new String[] + "=" + "_id", null, 
       null, null, null, null); 
     if (mCursor != null) { 
      mCursor.moveToFirst(); 
     } 

어떻게해야합니까 감사

+0

Textview에서 1을 1로 의미합니까? 조금 더 명확히 할 수 있습니까? – gtdevel

+0

@gtdevel 2 개의 버튼이 있습니다 (이전/다음). 그들을 누르면 이전/다음 인용문으로 이동하여 텍스트보기에 표시합니다. – Nima

+0

그것은 textview 당신의 문제가 있거나 칼럼에 대한 sqlite 쿼리입니까? 또는 둘 다? – gtdevel

답변

3

이 함수는 "db"가 ​​데이터베이스 인스턴스 인 데이터베이스에서 데이터를 가져 오는 방법입니다. 이 함수는 2D 문자열 배열을 반환합니다. 여기서 [0] [x]는 가져온 첫 번째 행이고 [1] [x]는 두 번째 등입니다. x는 열이며, 귀하의 경우 [0] [1]은 (는) 귀하의 데이터베이스에서 첫 번째 인용문이됩니다.

public String[][] customQuery(String query) { 
    Cursor cur = null; 
    try { 
     cur = db.rawQuery(query,null); 
    } catch(SQLException e) { 
     Log.d("DATABASE", e.toString()); 
    } 

    String data[][] = new String[cur.getCount()][cur.getColumnCount()]; 

    if (cur != null) { 
     int i = 0; 
     while (cur.moveToNext()) { 
      int j = 0; 
      while (j < cur.getColumnCount()) { 
       data[i][j] = cur.getString(j); 
       j++; 
      } 
      i++; 
      cur.moveToNext(); 
     } 
     cur.close(); 
    } 
    return data; 
} 
+1

게시 된 코드를 개선해야했습니다. NPE 취약점이 있으며'cur.isAfterLast() == false'의 사용법은 논리적으로 괜찮지 만'cur.moveToNext()'도 부울을 반환합니다. 그래서 이것을 확인하는 것이 더 쉽고'moveToFirst()'호출을 불필요하게 만든다. – WarrenFaith

+0

고마워, 잘됐다! – Nima

1

나는를 사용합니다 rawQuery 커서를 가져 와서 스크롤하십시오. SQLiteDatabase 설명서에서 메서드를 찾습니다.

TextView와 같습니다. xml 파일에서 textview를 선언하십시오. 현재 커서의 위치를 ​​기억하는 변수를 유지하십시오. 일단 당신의 rawQuery가 당신에게 적절한 컬럼을 제공하면, 당신은 그것에있는 요소를 찾는 데 사용할 수있는 많은 메소드가 있습니다. 여기에서 확인하십시오 : Cursor.

2

요한의 해결책은 괜찮지 만 논리 개체 사용에 대해 생각해보아야합니다. 테이블의 대부분 한 행은 논리 개체를 나타냅니다. 데이터베이스 행을 하나의 객체로 가져와 쉽게 작업 할 수 있도록해야합니다.

Bookmark 개체에 대한 샘플 :

public static List<Bookmark> getBookmarks(SQLiteDatabase db, long emagId) { 
    List<Bookmark> bookmarksList = null; 
    Cursor cursor = null; 
    try { 
     // WHERE clause for the SELECT query 
     final String where = Bookmark.EMAG_ID + " = " + emagId; 

     cursor = db.query(Bookmark.TABLE, new String[] {}, where, null, null, null, null); 

     bookmarksList = new ArrayList<Bookmark>(); 

     while (cursor.moveToNext()) { 
      Bookmark bookmark = new Bookmark(); 
      bookmark.id = cursor.getLong(cursor.getColumnIndex(Bookmark.ID)); 
      bookmark.emag_id = cursor.getLong(cursor.getColumnIndex(Bookmark.EMAG_ID)); 
      bookmark.page_number = cursor.getInt(cursor.getColumnIndex(Bookmark.PAGE_NUMBER)); 
      bookmark.article_id = cursor.getLong(cursor.getColumnIndex(Bookmark.ARTICLE_ID)); 

      bookmark.ref_html = cursor.getString(cursor.getColumnIndex(Bookmark.REF_HTML)); 
      bookmark.ref_text = cursor.getString(cursor.getColumnIndex(Bookmark.REF_TEXT)); 

      bookmark.ref_html = bookmark.ref_html; 
      bookmark.ref_text = "Page: " + bookmark.page_number; 

      bookmark.resource_id = cursor.getLong(cursor.getColumnIndex(Bookmark.RESOURCE_ID)); 
      bookmark.resource_type = cursor.getInt(cursor.getColumnIndex(Bookmark.RESOURCE_TYPE)); 
      bookmark.source_type = cursor.getInt(cursor.getColumnIndex(Bookmark.SOURCE_TYPE)); 
      bookmark.content_path = cursor.getString(cursor.getColumnIndex(Bookmark.CONTENT_PATH)); 

      bookmarksList.add(bookmark); 
     } 
    } catch (Exception e) { 
     Log.e(LOG_TAG, "::getBookmarksForEmagId", e); 
    } finally { 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 
    return bookmarksList; 
} 

나는 당신의 질문 new String[] + "=" + "_id"이 코드를 보았다. 나는 이것이 작동하지 않을 것이라고 생각합니다 ...

관련 문제