在Android中的两个活动之间共享数据库

时间:2015-02-23 19:06:49

标签: android sqlite

我有一个DataBaseAdapter类,它基本上创建了数据库,表和一些操作其中数据的方法。

看起来像这样 -

import ...

public class DataBaseAdapter  {

    DataBaseForApp dataBaseForApp;
    //Constructor for DataBaseAdapter
    public DataBaseAdapter(Context context) {

    }
    //insert data
    public long insertData(String player_name,int enrollmentno)
    {
        SQLiteDatabase SQLiteDB=dataBaseForApp.getWritableDatabase();
        ContentValues contentValues=new ContentValues();
        contentValues.put(dataBaseForApp.NAME,player_name);
        contentValues.put(dataBaseForApp.ENROL,enrollmentno);
        long id=SQLiteDB.insert(dataBaseForApp.DATABASE_TABLE,null,contentValues);
        SQLiteDB.close();
        return id;
    }
    //search for a player name and the square grid size
    public boolean search(String player_name, int enrollmentno)
    {
        SQLiteDatabase SQLiteDB=dataBaseForApp.getWritableDatabase();
        String[] columns={dataBaseForApp.NAME,dataBaseForApp.ENROL};
        String[] arguments={player_name,Integer.toString(enrollmentno)};
        Cursor cursor=SQLiteDB.query(dataBaseForApp.DATABASE_TABLE,columns,null,null,null,null,null);
        while(cursor.moveToNext())
        {
            int index1=cursor.getColumnIndex(dataBaseForApp.NAME);
            int index2=cursor.getColumnIndex(dataBaseForApp.ENROL);
            String name=cursor.getString(index1);
            int gsize=cursor.getInt(index2);
            if(name.equals(player_name)&&gsize==enrollmentno)
            {
                return true;
            }
        }
        SQLiteDB.close();
        return false;

    }
    // main class
    static class DataBaseForApp extends SQLiteOpenHelper{
        private static final String DATABASE_NAME="SQLiteDB_FOR_APP";
        private static final String DATABASE_TABLE="INFO";
        private static final int DATABASE_VERSION=1;
        private static final String NAME="NAME";
        private static final String ENROL="ENROL";
        private static final String CREATE_TABLE="CREATE TABLE "+DATABASE_TABLE+"("+NAME+" VARCHAR(100), "+ENROL+" INT)";
        private static final String DROP_TABLE="DROP TABLE IF EXISTS "+DATABASE_TABLE;


        public DataBaseForApp(Context context) {
            super(context,DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase SQLiteDB) {
            try {
                SQLiteDB.execSQL(CREATE_TABLE);
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }

        @Override
        public void onUpgrade(SQLiteDatabase SQLiteDB, int oldVersion, int newVersion) {
            try {
                SQLiteDB.execSQL(DROP_TABLE);
                onCreate(SQLiteDB);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

然后我在第一次活动中做到了这一点 -

DataBaseAdapter dataBaseAdapter=new DataBaseAdapter(ActivityOne.this);

在此之后,已经创建了一个数据库,并且我可以使用DataBaseAdapter中的方法进行操作。

到目前为止,它很酷,但是当我想为我的第二个活动获取相同的数据库以从那里插入数据时出现问题。

如果我使用它 -

 DataBaseAdapter dataBaseAdapter=new DataBaseAdapter(ActivityTwo.this);

然后,这意味着我想再次创建数据库。

请建议我如何在两个活动之间共享数据库。

提前致谢!

2 个答案:

答案 0 :(得分:1)

首先,您的DataBaseForApp类永远不会被实例化。我假设您希望在DataBaseAdapter构造函数中完成此操作。

其次,您要做的是拥有DataBaseForApp(extends SQLiteOpenHelper)类的多个实例。恕我直言,你不需要这个。您可以像这样继承Application类:

public class MyApplication extends Application {
    private static DataBaseAdapter dbAdapter;

    public static SQLiteDatabase getDbAdapter() {
        return dbAdapter;
    } 

    @Override 
    public void onCreate() { 
        super.onCreate(); 
        dbAdapter = new DataBaseAdapter(getApplicationContext());
    } 
} 

在manifest.xml文件中:

<application
    android:name=".MyApplication">

答案 1 :(得分:0)

您可以制作abstract BaseActivity,其他所有活动都可以延伸。在BaseActivity内创建DataBaseAdapter的实例。您可以在所有活动中使用它。以下是一个示例:android how to create my own Activity and extend it?

您可以将BaseActivity用作所有活动中所需内容的单个位置。例如:ProgressDialogAlertDialog等。