【问题标题】:How to refer to to a SQLite database from an 'independent' Method in Android如何从 Android 中的“独立”方法引用 SQLite 数据库
【发布时间】:2011-01-19 20:05:56
【问题描述】:

我有代码可以从我的“主要”活动中访问一个完美运行的 SQLite 表。我试图通过创建一个单独的类来处理数据插入、删除等来使代码更优雅。

当我将完全相同的代码从主要活动移动到单独的类时,我收到以下错误:

方法 openOrCreateDatabase(字符串,整数, null) 未定义该类型 条码

我注意到,通过使用“Activity”扩展我的数据库类,错误消失了。但是,现在我在运行代码时收到 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);

 }

}

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    您应该将相关的上下文传递给类,而不是让您的数据库类扩展 Activity。您可以在构造函数中传递它,并将对 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);
    
        }
    }
    

    要使用该类,您可以在 Activity 中执行此操作:

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

    【讨论】:

    • 另外,openOrCreateDatabase and setXXXX 部分在open 方法中会更好。如果他想插入几行,他不需要每次都经过openOrCreateDatabase这个过程
    • 你们摇滚!你会说这是实现我想做的事情的好方法,还是我仍然应该坚持使用数据助手?
    • @Eugene: 见developer.android.com/intl/fr/reference/android/content/…, int, android.database.sqlite.SQLiteDatabase.CursorFactory)
    【解决方案2】:

    似乎解决这些问题的方法是创建一个数据助手。我遵循了本教程,现在我可以从任何地方引用数据库代码: http://www.screaming-penguin.com/node/7742

    编辑: 我找到了一个更好的教程,事实上,一个来自 Google 自己的优秀教程,其中包含许多做这类事情的最佳实践,包括使用数据适配器正确抽象数据库访问。这是这里的笔记本教程:http://developer.android.com/resources/tutorials/notepad/index.html

    【讨论】:

      【解决方案3】:

      您可以尝试将 DB 指针传递给您的 mUpc 例程。

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

      你将不得不重写 mUpc 的构造函数来接受 db 对象。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多