Android 如何创建一个数据库对象,该对象在没有任何数据库锁定异常的情况下提供连接
在我的应用程序中,有很多数据库交互,因此我创建了一个数据库类来保存数据库创建和连接,以及多个访问该数据库类以进行连接的类 现在我的问题是当这些类访问数据库类时,我得到了Android 如何创建一个数据库对象,该对象在没有任何数据库锁定异常的情况下提供连接,android,android-sqlite,Android,Android Sqlite,在我的应用程序中,有很多数据库交互,因此我创建了一个数据库类来保存数据库创建和连接,以及多个访问该数据库类以进行连接的类 现在我的问题是当这些类访问数据库类时,我得到了数据库锁定异常,谷歌搜索了很多,一些人建议创建单例类,但我无法创建这样的类 我的代码: 主要活动 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) {
数据库锁定
异常,谷歌搜索了很多,一些人建议创建单例
类,但我无法创建这样的类
我的代码:
主要活动
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Database d=new Database(this);
Abc a=new Abc(getApplicationContext()) ;
d.insert();
// d.retrive();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
数据库类:
public class Database extends SQLiteOpenHelper{
private String Tablename = "Table1";
private String Column1 = "RegionID";
private String Column2 = "RegionName";
private String Column3 = "Currency";
SQLiteDatabase db;
public Database(Context context) {
super(context, "Test", null, 2);
db=this.getWritableDatabase();
// db=this.getWritableDatabase();
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db1) {
// TODO Auto-generated method stub
final String r_Table = "CREATE TABLE " + Tablename + " (" + Column1+ " INTEGER PRIMARY KEY , " + Column2 + " TEXT, " + Column3 + " Text) ";
db.execSQL(r_Table);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
public void insert(){
try{
ContentValues cv=new ContentValues();
for(int i=1;i<=10;i++){
cv.put(Column1, i);
cv.put(Column2, "USA");
cv.put(Column3, "Dollar");
db.insert(Tablename, null, cv);
}
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
public void retrive(){
try{
Cursor c=db.rawQuery("Select * from Table1", null);
if (c != null ) {
if (c.moveToFirst()) {
//Toast.makeText(new MainActivity().getApplicationContext(), c.getCount(), Toast.LENGTH_LONG).show();
System.out.println("Rows are:"+c.getCount());
}
}
c.close();
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
请帮帮我,给我一条出路
编辑更改的代码
数据库类:
public class Database extends SQLiteOpenHelper{
private String Tablename = "Table1";
private String Column1 = "RegionID";
private String Column2 = "RegionName";
private String Column3 = "Currency";
SQLiteDatabase db;
private static Database sInstance;
public Database(Context context) {
super(context, "Test", null, 2);
//db=this.getWritableDatabase();
// db=this.getWritableDatabase();
// TODO Auto-generated constructor stub
}
public static Database getInstance(Context context) {
if (sInstance == null) {
sInstance = new Database(context.getApplicationContext());
}
return sInstance;
}
@Override
public void onCreate(SQLiteDatabase db1) {
// TODO Auto-generated method stub
final String r_Table = "CREATE TABLE " + Tablename + " (" + Column1+ " INTEGER PRIMARY KEY , " + Column2 + " TEXT, " + Column3 + " Text) ";
db1.execSQL(r_Table);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
public void insert(){
db=getWritableDatabase();
try{
ContentValues cv=new ContentValues();
for(int i=1;i<=10;i++){
cv.put(Column1, i);
cv.put(Column2, "USA");
cv.put(Column3, "Dollar");
db.insert(Tablename, null, cv);
}
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
public void retrive(){
try{
Cursor c=db.rawQuery("Select * from Table1", null);
if (c != null ) {
if (c.moveToFirst()) {
//Toast.makeText(new MainActivity().getApplicationContext(), c.getCount(), Toast.LENGTH_LONG).show();
System.out.println("Rows are:"+c.getCount());
}
}
c.close();
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
Abc班
import android.content.Context;
public class Abc {
Context c1;
public Abc(Context mcontext) {
// TODO Auto-generated constructor stub
c1=mcontext;
Database.getInstance(c1);
}
}
这就是使用DB(SQLiteOpenHelper的singleton)所需的全部内容:
谢谢你的回复@nikis我这里没有什么疑问。1.
SQLiteDatabase db=getwriteabledatabase()
如果此行不在构造函数中
则控件不会转到onCreate
,您的示例也有相同的代码,那么控件将如何转到onCreate。2.通过重复调用getWritableDatabase()
我们不会得到数据库锁定异常。。你也能解释一下这个单身班的工作情况吗。它将转到onCreate,因为您可以通过将db的名称传递给super在构造函数中插入db。2不,我们没有,因为:一旦成功打开数据库,数据库就会被缓存,所以每次需要写入数据库时都可以调用此方法。singleton很简单,每次尝试获取它的实例时,都会使用相同的对象。在这种情况下,我如何调用需要数据库连接的方法。在上面的代码中,我正在从主活动调用Insert
,现在我希望数据库连接调用该活动。我该怎么做?我已经对问题进行了编辑并尝试了您的程序,请确认我是否正确。。很抱歉问了这么多问题。。我是android的新手,自己学习。谢谢
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Database d=new Database(this);
// Database.getInstance(getApplicationContext());
Abc a=new Abc(getApplicationContext()) ;
Database.getInstance(getApplicationContext()).insert();
Database.getInstance(getApplicationContext()).retrive();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
import android.content.Context;
public class Abc {
Context c1;
public Abc(Context mcontext) {
// TODO Auto-generated constructor stub
c1=mcontext;
Database.getInstance(c1);
}
}
public class Database extends SQLiteOpenHelper {
private static Database sInstance;
private String Tablename = "Table1";
private String Column1 = "RegionID";
private String Column2 = "RegionName";
private String Column3 = "Currency";
private Database(Context context) {
super(context, "Test", null, 2);
}
public static Database getInstance(Context context) {
if (sInstance == null) {
sInstance = new Database(context.getApplicationContext());
}
return sInstance;
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String r_Table = "CREATE TABLE " + Tablename + " (" + Column1 + " INTEGER PRIMARY KEY , " + Column2 + " TEXT, " + Column3 + " Text) ";
db.execSQL(r_Table);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
public void insert() {
SQLiteDatabase db = getWritableDatabase();
try {
ContentValues cv = new ContentValues();
for (int i = 1; i <= 10; i++) {
cv.put(Column1, i);
cv.put(Column2, "USA");
cv.put(Column3, "Dollar");
db.insert(Tablename, null, cv);
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public void retrive() {
SQLiteDatabase db = getWritableDatabase();
try {
Cursor c = db.rawQuery("Select * from Table1", null);
if (c.moveToFirst()) {
//Toast.makeText(new MainActivity().getApplicationContext(), c.getCount(), Toast.LENGTH_LONG).show();
System.out.println("Rows are:" + c.getCount());
}
c.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public Cursor retriveCursor() {
SQLiteDatabase db = getWritableDatabase();
return db.rawQuery("Select * from Table1", null);
}
}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Database d = Database.getInstance(this);
d.insert();
d.retrive();
Cursor cursor = d.retrieveCursor();
//do stuff with cursor
cursor.close;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}