2010-12-09 53 views
3

我有點難以理解SQLite數據庫如何在android中工作的概念。我創建了一個DatabaseHelper.java類如下:android和java中的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); 
    } 

} 

據我所知這樣做的工作,利用亞行控制檯得到遏制。

我的問題是如何從不同的活動在應用程序中查詢這個數據庫,例如我想在我的應用程序中查詢數據庫:SELECT title FROM books;這將返回書名中的標題,我該如何去連接數據庫,運行這個查詢然後將所有結果存儲到數組中?

---------------------------------- Edit ----------- -----------------------------

就這樣在我想查詢的部分我已經放置了這段代碼:

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(); 
     } 

它將類別向下傳遞給前一個活動。來自Olivier的回答。此代碼崩潰的應用程序,我不知道爲什麼。在此if語句之後使用變量cont_array來填充ListView。任何人有任何想法,我錯了,LogCat中沒有什麼能告訴我它失敗的地方?

回答

3

東西你的活動內執行以下操作:

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(); 
    } 
} 
3

爲了讀取和寫入數據庫,您需要先在您的Activity之一中獲取SQLiteDatabase對象的實例。使用DatabaseHelper類,您可以通過調用databaseHelper.getReadableDatabase()databaseHelper.getWritableDatabase()來完成此操作,具體取決於您需要採取的操作(讀取/寫入)。

當你有一個SQLiteDatabase的實例後,你可以使用它的各種幫助器方法來執行CRUD操作。例如,要運行查詢SELECT title FROM books,您可以使用各種query()方法之一。也有insert()update()delete()方法可用。這些方法有時會返回Cursor,然後可用於諸如ListView之類的對象來遍歷數據庫中的結果集。如果可能的話,我建議你使用Cursor而不是填充結果到數組中,只是因爲有相當多的方法和對象可以和Cursors一起使用。

注:請務必關閉的SQLiteDatabase任何情況下,你已經完成後,您的讀/寫操作,以避免資源泄漏的問題。

如果您需要更多信息,我建議您閱讀API Documentation中每個班級的具體細節。

1

請檢查我的崗位上的SQLite http://android-pro.blogspot.com/2010/10/using-sqlite-database-with-android.html

有一個示例應用程序,你可以立即下載它,並選中要

+8

請不要發佈鏈接而不是答案。相反,發佈答案,如果需要更多解釋,鏈接。這樣,如果鏈接死了,答案仍然可用。 – 2010-12-09 13:28:57

+1

我發佈的鏈接,以避免寫大量的文字 – 2010-12-09 13:33:01