如何从两个活动中读取和写入sqlite数据库

时间:2014-09-13 10:25:18

标签: android database sqlite

现在我希望我的两个活动可以访问相同的数据库。我有一个主要活动和第二个活动..主要活动在数据库中插入一些值,并在主活动启动第二个活动后,第二个应该调用相同的数据库并读取表,并应该返回列表..在我的情况下它的无效主活动成功将值插入数据库,但第二个活动无法返回值。它总是返回空列表...请帮助我......这是访问数据库的第二个活动的编码......

public class SecondActivty extends Activity
{
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.screen);

    List<String> objlist=new ArrayList<String>();
    objlist=objdatabase.getdetail(accessCode);
    if(objlist.size()!=0)
    {
        Toast.makeText(this,"got values", Toast.LENGTH_LONG).show();
    }
    else
   {
       Toast.makeText(this,"no value", Toast.LENGTH_LONG).show();
   }
}

}

public List<String> getdetail(String code)
{
List<String> objDetail=new ArrayList<String>();
Cursor cGetDetail=objDB.rawQuery("SELECT TITLE,LOCATION,DATE FROM HISTORY WHERE CODE='"+Code+"'",     null);             
        if(cGetDetail.getCount()>0)
        {
            if(cGetDetail.moveToFirst())
            {

                String sTitle = cGetDetail.getString(cGetDetail.getColumnIndex("TITLE"));
                String sLocation = cGetDetail.getString(cGetDetail.getColumnIndex("LOCATION"));
                String sDate=cGetDetail.getString(cGetDetail.getColumnIndex("DATE"));
                objDetail.add(new String(String.valueOf(sTitle)));
                objDetail.add(new String(String.valueOf(sLocation)));
                objDetail.add(new String(String.valueOf(sDate)));
            }
        }

        return objDetail;

public DB extends SQLiteOpenHelper
{
public DB(Context context) {
    super(context, DB_NAME, null, 1);
    objContext = context;

    try {
        createDataBase();
    } catch (IOException e) {
        e.printStackTrace();
    }
    openDataBase();

}

private boolean checkDataBase(){

    //SQLiteDatabase checkDB = null;
    boolean checkDB = false;
    try
            {
        String sMyPath = DB_PATH + DB_NAME;
        //checkDB = SQLiteDatabase.openDatabase(sMyPath, null, SQLiteDatabase.OPEN_READONLY);
         File dbfile = new File(sMyPath);
        checkDB = dbfile.exists();
    }
    catch(SQLiteException e)
    {

    }
    return checkDB;

}


public void createDataBase() throws IOException{

    boolean bDatabaseExist = checkDataBase();

    if(bDatabaseExist)
    {
        //do nothing - database already exist
    }
    else
    {

        this.getReadableDatabase();

        try 
        {
            copyDataBase();
        } 
        catch (IOException e) 
        {
            throw new Error("Error copying database");
        }
    }
}

private void copyDataBase() throws IOException{

    try
    {
        //Open your local db as the input stream
        InputStream objMyInput = objContext.getAssets().open(DB_NAME);

        // Path to the just created empty db
        String sOutFileName = DB_PATH + DB_NAME;

        //Open the empty db as the output stream
        OutputStream objMyOutput = new FileOutputStream(sOutFileName);

        //transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024];
        int nLength;
        while ((nLength = objMyInput.read(buffer))>0)
        {
            objMyOutput.write(buffer, 0, nLength);
        }

        //Close the streams
        objMyOutput.flush();
        objMyOutput.close();
        objMyInput.close();
    }
    catch(Exception e)
    {
        Toast.makeText(objContext, "Copy Error-"+e.toString(), Toast.LENGTH_LONG).show();
    }
}

public void openDataBase() throws SQLException{

    //Open the database
    String sMyPath = DB_PATH + DB_NAME;
    objDatabase = SQLiteDatabase.openDatabase(sMyPath, null, SQLiteDatabase.OPEN_READWRITE);

}
}

2 个答案:

答案 0 :(得分:0)

首先,当您使用First Activity

完成数据库时,需要关闭数据库
objdatabase.close();
  

然后在你的第二个活动中,你需要实现DBHelper和   打开你的数据库,然后调用objdatabase.getdetail(accessCode);不要忘记再次关闭它

答案 1 :(得分:0)

您的数据访问代码应位于单独的“数据访问者”类中,而不应位于活动中。数据访问代码应负责打开和关闭数据库连接。这意味着您可以将数据访问代码保持独立和清洁,并且可以从任何活动中调用它。这是一个很好的指向教程的链接,该教程解释了如何构建数据访问类Vogella data access