Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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
Android 如何创建一个数据库对象,该对象在没有任何数据库锁定异常的情况下提供连接_Android_Android Sqlite - Fatal编程技术网

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;
    }

}