Java Sqlite数据库上下文
我已经创建了一个数据库类文件,以便在Android应用程序中使用SQLite db。因为我是初学者,在将数据库类实例化到另一个类时,我很难理解应该在上下文中放置什么 数据库代码如下:Java Sqlite数据库上下文,java,android,Java,Android,我已经创建了一个数据库类文件,以便在Android应用程序中使用SQLite db。因为我是初学者,在将数据库类实例化到另一个类时,我很难理解应该在上下文中放置什么 数据库代码如下: public Database(@Nullable Context context) { super(context,DATABASE_NAME,null,DATABASE_VERSION); database=getWritableDatabase(); 如何将其实例化为另一个类
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
aSingleton
首先在您的活动中全局声明上下文:
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();
}
}