Search code examples
javaandroidandroid-sqlite

Sqlite: Updating is done but on retrieving, value returned is null


I'm using an existing database. For a table in that database, I'm updating a column's value of a particular row identified by 'chapter' and 'verse' by some user input (String). The updating is successful, however on retrieving the updated value, it shows null.

FragmentFour.java

public class FragmentFour extends Fragment {

    DataBaseHelper dbHelper;

    @Override
    public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ......
        dbHelper = new DataBaseHelper(getActivity());
        ......
    }
    
    public void someFunction(){
        String notes = dbHelper.getNotes("SomeBookName",some_chapter,some_verse);
    }
}

DataBaseHelper.java

public class DataBaseHelper extends SQLiteOpenHelper{
    private static String TAG = "DataBaseHelper"; // Tag just for the LogCat window destination path (location) of our database on device
    private static String DB_PATH = "";
    private static String DB_NAME ="zypnt.sqlite";// Database name
    private SQLiteDatabase mDataBase;
    private final Context mContext;

    public DataBaseHelper(Context context)
    {
        super(context, DB_NAME, null, 1);// 1? its Database Version
        if(android.os.Build.VERSION.SDK_INT >= 17){
            DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
        }
        else
        {
            DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
        }
        this.mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
    }

    public void createDataBase() throws IOException
    {
        //If database not exists copy it from the assets

        boolean mDataBaseExist = checkDataBase();
        if(!mDataBaseExist)
        {
            this.getReadableDatabase();
            this.close();
            try
            {
                //Copy the database from assests
                copyDataBase();
                Log.e(TAG, "createDatabase database created");
            }
            catch (IOException mIOException)
            {
                throw new Error("ErrorCopyingDataBase");
            }
        }
    }
    //Check that the database exists here: /data/data/your package/databases/Da Name
    private boolean checkDataBase()
    {
        File dbFile = new File(DB_PATH + DB_NAME);
        //Log.v("dbFile", dbFile + "   "+ dbFile.exists());
        return dbFile.exists();
    }

    //Copy the database from assets
    private void copyDataBase() throws IOException
    {
        InputStream mInput = mContext.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream mOutput = new FileOutputStream(outFileName);
        byte[] mBuffer = new byte[1024];
        int mLength;
        while ((mLength = mInput.read(mBuffer))>0)
        {
            mOutput.write(mBuffer, 0, mLength);
        }
        mOutput.flush();
        mOutput.close();
        mInput.close();
    }

    //Open the database, so we can query it
    public boolean openDataBase() throws SQLException
    {
        String mPath = DB_PATH + DB_NAME;
        //Log.v("mPath", mPath);
        mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY);
        //mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
        return mDataBase != null;
    }

    @Override
    public synchronized void close()
    {
        if(mDataBase != null)
            mDataBase.close();
        super.close();
    }

    public String getNotes(String book,String chapter,String verse){

        SQLiteDatabase mDb = this.getWritableDatabase();
        String notes = "";
        try{
            Cursor c = mDb.rawQuery("SELECT footnotes FROM " + book + " WHERE chapter="+chapter+" and verse="+verse+"", null);
            if(c.getCount()<=0)
                return notes;
            else {
                c.moveToFirst();
                notes = c.getString(0);
                c.close();
            }   
        } catch (Exception e) {
            Log.e("getCrossReferences", e.getMessage());
        }
        mDb.close();
        return notes;
    }

    public Boolean setNotes(String book,String chapter,String verse,String note){

        SQLiteDatabase mDb = this.getWritableDatabase();
        Boolean flag = false;
        try{
            Cursor c = mDb.rawQuery("UPDATE "+book+" SET footnotes='" + note + "' WHERE chapter="+chapter+" and verse="+verse+"", null);
            c.close();
            flag = true;
        } catch (Exception e) {
            Log.e("getCrossReferences", e.getMessage());
        }
        mDb.close();
        return flag;
    }

}

Solution

  • Try this change:

    public Boolean setNotes(String book,String chapter,String verse,String note){
    
            SQLiteDatabase mDb = this.getWritableDatabase();
            Boolean flag = false;
            try{
                Cursor c = mDb.rawQuery("UPDATE "+book+" SET footnotes='" + note + "' WHERE chapter="+chapter+" and verse="+verse+"", null);
                c.moveToFirst();
                c.close();
                flag = true;
            } catch (Exception e) {
                Log.e("getCrossReferences", e.getMessage());
            }
            mDb.close();
            return flag;
        }