Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Sqlite数据库上下文_Java_Android - Fatal编程技术网

Java Sqlite数据库上下文

Java Sqlite数据库上下文,java,android,Java,Android,我已经创建了一个数据库类文件,以便在Android应用程序中使用SQLite db。因为我是初学者,在将数据库类实例化到另一个类时,我很难理解应该在上下文中放置什么 数据库代码如下: public Database(@Nullable Context context) { super(context,DATABASE_NAME,null,DATABASE_VERSION); database=getWritableDatabase(); 如何将其实例化为另一个类

我已经创建了一个数据库类文件,以便在Android应用程序中使用SQLite db。因为我是初学者,在将数据库类实例化到另一个类时,我很难理解应该在上下文中放置什么 数据库代码如下:

public Database(@Nullable Context context) {
        super(context,DATABASE_NAME,null,DATABASE_VERSION);
        database=getWritableDatabase();
如何将其实例化为另一个类。实例化数据库时db=new Database();
应该放在上下文下的内容

如果将其实例化为RandomActivity类,则应该放:

Database db = new Database(this);


使用应用程序上下文,这将确保不会意外泄漏活动的上下文。 有关更多信息,请参阅本文:

将您的SqliteDB类设为singleton,如下所示-

private static Database sInstance;

public static synchronized Database getInstance(Context context) {
        if (sInstance == null) {
            sInstance = new Database(context.getApplicationContext());
        }
        return sInstance;
    }

    private ChatSQliteDB(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        Log.v("SQLTVer", "ver "+DATABASE_VERSION);
    }

Android文档基于上下文

与有关应用程序环境的全局信息的接口。这是一个抽象类,其实现由Android系统提供。它允许访问特定于应用程序的资源和类,以及调用应用程序级操作,如启动活动、广播和接收意图等

因此,当您创建
视图时
需要向其传递
上下文
,但为什么呢?如果未传递
上下文,您的
视图
将丢失的内容。您的
视图
将失去访问系统资源的能力。例如,假设有一个
Drawable
要设置为
视图
的背景,没有上下文,您的
视图
无法访问该
Drawable

public class MyView extends View {

public MyView(Context context) {
    super(context);
    Drawable d = context.getDrawable(R.drawable.ic_launcher_background);
    getDrawable(R.drawable.ic_launcher_background);  //without context IDE will give error cannot resolve getDrawable(int).
    }
}
因此,当您创建
视图
时,您将
活动上下文
传递给它,因为您的
视图
与您的
活动
相关联。它不应超过
活动

MyView myView = new MyView(this);
您可以使用
作为上下文,因为您的
活动
扩展自
上下文包装
,它扩展自
上下文
上下文包装

现在,如果您想创建一个
数据库
,并且如果您的应用程序有多个
活动
,需要访问
DB
,那么您的
DB
应该比创建
DB
实例的
活动
更有效,因此在这种情况下,您应该使用
应用程序上下文
来创建
DB

即使您有一个
活动
应用程序,您的
数据库
也应该比
活动
更长寿,因为您的
活动
将在每次
旋转时重新启动。但是您的
应用程序
不是。因此,这里还应该传递
应用程序上下文

一般来说,将
Context
视为新创建对象的生存期,因为
DB
通常需要
Application
生存期

一个例子:你的应用程序从<代码>活动A/COD>开始,下载大的<代码>位图< /代码>表单网络,在其<代码>上下文< /代码>中创建<代码> dB <代码>实例,并将<代码>位图< /> >保存到<代码> dB < /代码>。之后,您的

活动A
开始
活动B
A
完成。现在您的
活动A
不再是必需的,应该进行垃圾收集。但是您的
DB
在其
上下文上仍然处于活动状态,因此
A
将不会被gc'ed,并将导致内存泄漏


最后,正如纳雷什在他的回答中指出的那样,您应该将您的
DB
a
Singleton

首先在您的活动中全局声明上下文:

Context context = this
然后在非活动类中创建一个需要参数上下文的方法/函数

class YOUR_CLASS{

    public void YOUR_METHOD(Context context){       //method with require context parameter

         Database db = new Database(context);  //supplied the context from your activity
    }
}
然后使用提供的上下文从活动中的\u类调用\u方法

new YOUR_CLASS().YOUR_METHOD(context); //supply context on your method

我创建了一个新类

import android.app.Application;
import android.content.Context;

public class MySuperApplication extends Application {
    private static Application instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static Context getContext() {
        return instance.getApplicationContext();
    }
}

它将自动生成上下文。因此,无论在哪里询问,我们都可以编写Database db=new Database(MySuperApplication.getContext())

Database db=新数据库(Combiner.this);。我试过了,但它在数据库中显示的数据库(android.content,Context)无法应用于(com.example.data.Combiner)提供活动上下文,比如
Database db=new Database(MainActivity.this)。它应该是一个活动上下文而不是类上下文。创建一个接受应用程序上下文的单例数据库类。您可以获取。它显示的主活动不是封闭类。我想实例化为非活动类,然后将您的上下文从活动类转移到非活动类。
Database db=new Database(MySuperApplication.getContext())
每次都会为您提供
db
的新实例,您的
DB
应该是一个
Singleton
import android.app.Application;
import android.content.Context;

public class MySuperApplication extends Application {
    private static Application instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static Context getContext() {
        return instance.getApplicationContext();
    }
}