2011-01-19 43 views
1

我有訪問SQLite表的代碼,該表完全適用於我的「主」活動。我試圖通過創建一個單獨的類來處理數據插入,刪除等操作來使代碼更加優雅。如何從Android中的「獨立」方法引用SQLite數據庫

當我將完全相同的代碼從主活動移動到單獨的類時,出現以下錯誤:

The method openOrCreateDatabase(String, int, null) is undefined for the type BarCode

我注意到,通過擴展我的數據庫類與「活動」錯誤消失。但是,現在我得到NullPointerException當我運行代碼。

如何正確抽象數據庫代碼並仍然能夠從Android中的活動中引用它?

對不起,如果我聽錯了行話,因爲我是Android和Java的新手。

下面是完整的代碼:

package com.example.stockcontrol; 

import java.util.Locale; 

import android.app.Activity; 
import android.content.ContentValues; 
import android.database.sqlite.SQLiteDatabase; 

public class BarCode extends Activity { 

public BarCode() { 

} 

public void insertBarCode(String upc) { 

    SQLiteDatabase db; 
     db = openOrCreateDatabase(
     "StockControl.db" 
     , SQLiteDatabase.CREATE_IF_NECESSARY 
     , null 
     ); 
     db.setVersion(1); 
     db.setLocale(Locale.getDefault()); 
     db.setLockingEnabled(true); 

     ContentValues mUpc = new ContentValues(); 
     mUpc.put("upc", "444"); 
     mUpc.put("description", "Box o toast"); 
     mUpc.put("scan_count", "1"); 
     db.insertOrThrow("tbl_upc", null, mUpc); 

} 

} 

回答

2

而不是讓您的數據庫類擴展活動,您應該將相關的上下文傳遞給類。您可以在構造函數中傳遞它,並將Context的引用保留爲類變量。

public class BarCode { 
    private final Context mContext; 

    public BarCode(Context context) { 
     mContext = context; 
    } 

    public void insertBarCode(String upc) { 

    SQLiteDatabase db; 
      db = mContext.openOrCreateDatabase(
      "StockControl.db" 
      , SQLiteDatabase.CREATE_IF_NECESSARY 
      , null 
      ); 
      db.setVersion(1); 
      db.setLocale(Locale.getDefault()); 
      db.setLockingEnabled(true); 

      ContentValues mUpc = new ContentValues(); 
      mUpc.put("upc", "444"); 
      mUpc.put("description", "Box o toast"); 
      mUpc.put("scan_count", "1"); 
      db.insertOrThrow("tbl_upc", null, mUpc); 

    } 
} 

使用類,你會在你的活動做到這一點:

BarCode barCode = new BarCode(this); 
barCode.insertBarCode("123456"); 
+0

@ccheneson感謝您捕捉我的複製和粘貼錯誤! – 2011-01-19 21:07:54

+0

另外,`openOrCreateDatabase和setXXXX`部分在open方法中會更好。如果他想插入幾行,他不需要每次都通過`openOrCreateDatabase`進程 – ccheneson 2011-01-19 21:12:08

0

你可以試試DB指針傳遞給您的日常MUPC。

mUpc.put(db,"upc","444"); 

您將不得不重寫mUpc的構造函數來接受db對象。

+0

感謝您的回覆我會盡快理解如何編寫構造函數來接受對象。與此同時,我發現了Android的記事本教程: http://developer.android.com/resources/tutorials/notepad/index.html 我想我還有很多東西要學習! – 2011-01-19 20:37:25

1

似乎去了解這些事情的方式是創建一個數據幫手。我跟着這個教程,現在我可以引用從任何地方的數據庫代碼: http://www.screaming-penguin.com/node/7742

編輯: 我找到一個更好的教程,事實上,從谷歌本身就是一種極好的一個,包含了一些最佳做法,這樣做包括使用數據適配器正確抽象數據庫訪問。這是這裏的筆記本教程:http://developer.android.com/resources/tutorials/notepad/index.html

相關問題