2010-12-09 3 views
3

안드로이드에서 SQLite 데이터베이스가 어떻게 작동하는지 개념을 이해하는데 어려움이 있습니다. 나는이 작업을 수행하고, ADB 콘솔을 사용하여 확인되었습니다 알고 있어요 마찬가지로 지금까지안드로이드와 자바의 SQLite 데이터베이스

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DatabaseHelper extends SQLiteOpenHelper { 
    private static final String DATABASE_NAME = "library.db"; 
    public static final String TITLE = "title"; 
    public static final String MUSICTITLE = "musictitle"; 
    public static final String AUTHOR = "author"; 
    public static final String ARTIST = "artist"; 


    public DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, 1); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE music (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, artist TEXT);"); 
     db.execSQL("CREATE TABLE books (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, author TEXT);"); 
     db.execSQL("CREATE TABLE movies (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT);"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     android.util.Log.v("Constants", 
       "Upgrading database which will destroy all old data"); 
     db.execSQL("DROP TABLE IF EXISTS books"); 
     db.execSQL("DROP TABLE IF EXISTS music"); 
     db.execSQL("DROP TABLE IF EXISTS movies"); 
     onCreate(db); 
    } 

} 

: 나는 다음과 같이있는 DatabaseHelper.java 클래스를 만들었습니다.

제 질문은 어떻게 다른 활동에서 응용 프로그램 내 에서이 데이터베이스를 쿼리합니까, 예를 들어, 내 응용 프로그램에서 데이터베이스를 쿼리 할 수 ​​있습니다 : SELECT title FROM books; 책 테이블의 제목을 반환합니다. 데이터베이스에 연결하여이 쿼리를 실행 한 다음 모든 결과를 배열에 저장하는 방법은 무엇입니까?

---------------------------------- 편집 ---------------------------------- 편집 ----------- -----------------------------

바로 내가 쿼리 할 부분에서이 코드를 배치했습니다.

if (category.equals("Books")){ 
      img.setImageResource(R.drawable.book); 
      ArrayList<String> list = new ArrayList<String>(); 
      dh = new DatabaseHelper(this); 
      SQLiteDatabase db = dh.getReadableDatabase(); 
      Cursor cursor = db.query("books", new String[] { "title" }, null, null, null, null, "title desc"); 
      if (cursor.moveToFirst()) { 
       do { 
        list.add(cursor.getString(1)); 
       } while (cursor.moveToNext()); 
      } 
      if (cursor != null && !cursor.isClosed()) { 
       cursor.close(); 
      } 
      list.add("Test"); 
      cont_array = (String[]) list.toArray(); 
      db.close(); 
     } 

이전 활동을 카테고리로 전달합니다. 올리비에의 대답에서. 이 코드는 응용 프로그램을 충돌시키고 나는 그 이유를 모릅니다. 변수 cont_array는이 if 문 다음에 사용되어 ListView를 채 웁니다. 아무도 내가 잘못 가고있는 어떤 생각이 있어도 LogCat에 오류가있는 곳을 알려주는 것이 아무것도 없습니까?

답변

3

원하는 것을 확인할 수 있습니다 SQLite는 내 게시물을 확인하시기 바랍니다 다음을 수행하십시오

public class DBAct extends Activity { 
    private DataHelper dh; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     //init your activity here 
     //e.g. setContentView(R.layout.main); 

     dh = new DataHelper(this); 
     SQLiteDatabase db = dh.getReadableDatabase(); 
     Cursor cursor = db.query("books", new String[] { "title" }, null, null, null, null, "title desc"); 
     if (cursor.moveToFirst()) { 
      do { 
       list.add(cursor.getString(0)); 
      } while (cursor.moveToNext()); 
     } 
     if (cursor != null && !cursor.isClosed()) { 
      cursor.close(); 
     } 
     db.close(); 
    } 
} 
+0

코드를 사용한 후에도 내 질문을 편집했지만 여전히 오류가 있습니다. – SamRowley

+0

구체적인 오류 메시지가 없으면 말하기 어렵습니다. 그러나 코드에는 공통적 인 함정이 하나 있습니다. 'cont_array = (String []) list.toArray (new String [list.size()])' –

+0

나는이 문제를 분류했다. 그러나 데이터 가져 오기가 아무것도 가져 오지 않는 것 같다. , 그래서 list.add (cursor.getString (0)); 아무것도하지 않는 것 같습니다. TextView를 사용하여이 테스트를 수행 한 결과를 해당 텍스트 뷰로 가져 왔지만 false를 반환합니다. – SamRowley

3

데이터베이스에서 읽고 쓰려면 먼저 Activity 중 하나에서 SQLiteDatabase 개체의 인스턴스를 가져와야합니다. DatabaseHelper 클래스를 사용하면 수행해야 할 작업 (읽기/쓰기)에 따라 databaseHelper.getReadableDatabase() 또는 databaseHelper.getWritableDatabase()을 호출하여이 작업을 수행 할 수 있습니다.

SQLiteDatabase의 인스턴스를 얻은 후에는 다양한 도우미 방법을 사용하여 CRUD 작업을 수행 할 수 있습니다. 예를 들어 SELECT title FROM books 쿼리를 실행하려면 다양한 query() 메서드 중 하나를 사용할 수 있습니다. 사용할 수있는 방법은 insert(), update()delete()입니다. 이러한 메소드는 때때로 Cursor을 리턴하며, ListView과 같은 오브젝트에서이 결과 세트를 사용하여 데이터베이스에서 결과 세트를 탐색 할 수 있습니다. 가능하다면 배열에 결과를 채우는 것보다 Cursor을 사용하는 것이 좋을 것입니다. 간단히 말해서 커서와 함께 사용하기 좋은 메소드와 객체가 적당하기 때문입니다.

참고 : 리소스 누출 문제를 피하기 위해 읽기/쓰기를 완료 한 후에 SQLiteDatabase의 인스턴스를 닫아야합니다.

더 많은 정보가 필요하면 API Documentation에서 각 클래스의 특성을 읽는 것이 좋습니다.

1

샘플 응용 프로그램이 http://android-pro.blogspot.com/2010/10/using-sqlite-database-with-android.html

, 당신은 그것을 downlaod 및 활동 내부는

+8

하세요 답변 대신 링크를 게시하지 마십시오. 대신 답변을 게시하고 더 많은 설명이 필요하면 링크를 클릭하십시오. 이 방법으로 링크가 죽은 경우 대답을 계속 사용할 수 있습니다. –

+1

큰 활자체를 피하려고 링크를 게시했습니다. –

+2

죄송 합니다만, Valentin에 동의하지 않습니다. 내 의견으로는 링크가 매우 유용하게 보이고 여기에 형식이 잘 된 텍스트를 게시하는 것도 다소 어렵습니다. – saxos