Home > Software engineering >  How to use Stringbuilders in SQlite querries in Android studio
How to use Stringbuilders in SQlite querries in Android studio

Time:12-29

how i can use stringbuilder for the querries given below i don't have idea how to use it, if anyone can provide an example of how to use stringbuilders in querries. please help me out

 public ArrayList<User> getAllData(String Gender,String Status){
    ArrayList<User> arrayList = new ArrayList<>();
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor;

    String querry =  " select * from "  TABLE_NAME;


        if (!Gender.equals(""))
       {
           String querry1 = querry  " WHERE "   COLUMN_GENDER   " =?";
           String[]  select = new String[]{Gender};
            cursor = db.rawQuery(querry1,select);
       }

       else if (!Status.equals(""))
        {
                   String querry2 = querry  " WHERE "   COLUMN_STATUS   " =?";
                   String[] select = new String[]{Status};
                   cursor = db.rawQuery(querry2,select);
        }
       else {
           String querry3=querry;
            cursor = db.rawQuery(querry3, null);

       }


    if (cursor.moveToFirst()) {
        do {
            String FirstName = cursor.getString(0);
            String LastName = cursor.getString(1);
            String Email = cursor.getString(2);
            byte[] image = cursor.getBlob(5);
            String gender = cursor.getString(6);
            String status = cursor.getString(8);

            // Log.e("Image Length here", ""   image.length);
            //     Log.e("Gender Length here", ""   gender);
            User user = new User(FirstName, LastName, Email, image, gender, status);
            arrayList.add(user);
        }
        while (cursor.moveToNext());
    }
    return arrayList;
}}

CodePudding user response:

Use something like this

StringBuilder query = new StringBuilder().append(" select * from ").append(TABLE_NAME);

String query1 = query.append(" WHERE ").append(COLUMN_GENDER).append(" =?").toString();

String query2 = query.append(" WHERE ").append(COLUMN_STATUS).append(" =?").toString();

CodePudding user response:

Perhaps consider the following, which will cater for empty or null gender/status and for all combinations i.e. gender only, status only or both (assumes AND when both):-

@SuppressLint("Range") /* may be required due to issue with getColumnIndex with SDK 31 */
public ArrayList<User> getAllData(String Gender, String Status) {
    ArrayList<User> arrayList = new ArrayList<>();
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor;
    //String querry = " select * from "   TABLE_NAME; not needed
    StringBuilder whereclause = new StringBuilder(); // Added
    boolean genderArgRequired = false; // Added
    boolean statusArgRequired = false; // Added
    String[] whereargs = new String[]{}; // Added

    /* If gender is not null or it's length is > 0 then add the WHERE clause (less the WHERE keyword as query convenience method adds the WHERE clause)
    /* and indicate that arg is required
     */
    if (Gender != null && Gender.length() > 0) {
        whereclause.append(COLUMN_GENDER).append("=? ");
        genderArgRequired = true;
    }
    /* If status is not null and it's length is greater then
        if the whereclause is not empty (i.e. gender has been given) then
        add AND followed by the where clause
        otherwise no gender so add the WHERE clause
       and indicate that the arg is required
     */
    if (Status != null && Status.length() > 0) {
        statusArgRequired = true;
        if (whereclause.length() > 0) {
            whereclause.append(" AND ");
        }
        whereclause.append(COLUMN_STATUS).append("=? ");
    }

    /* Build the args (no args by default) */
    /* if both status and gender then both args required*/
    if (genderArgRequired && statusArgRequired) {
        whereargs = new String[]{Gender, Status};
    }
    /* Other if one of either is required add just the one arg */
    else {
        if (genderArgRequired) {
            whereargs = new String[]{Gender};
        }
        if (statusArgRequired) {
            whereargs = new String[]{Status};
        }
    }
    // Uses the query convenience method (i.e. builds the SQL)
    cursor = db.query(TABLENAME, null, whereclause.toString(), whereargs, null, null, null);
    // No need to moveTofirst while moveToNext has the same functionality
    while (cursor.moveToNext()) {
        // Can add a new user to the arraylist directly
        arrayList.add(new User(
                /* Note assumes column names */
                /* more flexible/safer to use getColumnIndex 
                    as column position is extracted from the cursor rather than being hardcoded.
                 */
                cursor.getString(cursor.getColumnIndex(COLUMN_FIRSTNAME)),
                cursor.getString(cursor.getColumnIndex(COLUMN_LASTNAME)),
                cursor.getString(cursor.getColumnIndex(COLUMN_EMAIL)),
                cursor.getBlob(cursor.getColumnIndex(COLUMN_IMAGE)),
                cursor.getString(cursor.getColumnIndex(COLUMN_GENDER)),
                cursor.getString(cursor.getColumnIndex(COLUMN_STATUS))
                )
        );
    }
    cursor.close(); //<<<<< SHOULD ALWAYS CLOSE CURSOR WHEN DONE WITH IT
    return arrayList;
}

Demo

The following demonstrates the above being used in a few scenarios :-

    /* Add some testing data */
    helper.insert(new User("User1","User1","[email protected]",new byte[]{0,0,0,0},"M","NEW"));
    helper.insert(new User("User2","User2","[email protected]",new byte[]{0,0,0,0},"F","OLD"));
    helper.insert(new User("User3","User3","[email protected]",new byte[]{0,0,0,0},"M","OLD"));
    helper.insert(new User("User4","User4","[email protected]",new byte[]{0,0,0,0},"F","NEW"));
    helper.insert(new User("User5","User5","[email protected]",new byte[]{0,0,0,0},"M","NOTHING"));
    helper.insert(new User("User6","User6","[email protected]",new byte[]{0,0,0,0},"F","NOTHING"));

    /* Call the logGetAllData for various scenarios */
    /* Note that the actual getAllData method is called from the logGetAllData method */
    logGetAllData("F","NEW","RUN1"); // User4 only
    logGetAllData("F","OLD","RUN2"); // User2 only
    logGetAllData(null,"","RUN3"); // ALL (1-6)
    logGetAllData("F",null,"RUN4"); // User2,4,6
    logGetAllData("","NEW","RUN5"); // User 1  and 4
    logGetAllData("?????","?????","RUN6"); // None
    logGetAllData(null,null,"RUN7"); // All

}

private void logGetAllData(String gender, String status, String tag_suffix) {
    for(User u: helper.getAllData(gender,status)) {
        Log.d("USERINFO_"   tag_suffix,
                "FirstName is "   u.FirstName  
                        " LastName is "   u.LastName  
                        " Gender is "   u.gender  
                        " Status is "   u.status  
                        " GENDER ARG =>"   gender   "< STATUS ARG =>"   status   "<"
        );
    }
}

Resulting in the log containing :-

2021-12-29 22:19:30.665 D/USERINFO_RUN1: FirstName is User4 LastName is User4 Gender is F Status is NEW GENDER ARG =>F< STATUS ARG =>NEW<
2021-12-29 22:19:30.667 D/USERINFO_RUN2: FirstName is User2 LastName is User2 Gender is F Status is OLD GENDER ARG =>F< STATUS ARG =>OLD<
2021-12-29 22:19:30.669 D/USERINFO_RUN3: FirstName is User1 LastName is User1 Gender is M Status is NEW GENDER ARG =>null< STATUS ARG =><
2021-12-29 22:19:30.669 D/USERINFO_RUN3: FirstName is User2 LastName is User2 Gender is F Status is OLD GENDER ARG =>null< STATUS ARG =><
2021-12-29 22:19:30.669 D/USERINFO_RUN3: FirstName is User3 LastName is User3 Gender is M Status is OLD GENDER ARG =>null< STATUS ARG =><
2021-12-29 22:19:30.669 D/USERINFO_RUN3: FirstName is User4 LastName is User4 Gender is F Status is NEW GENDER ARG =>null< STATUS ARG =><
2021-12-29 22:19:30.669 D/USERINFO_RUN3: FirstName is User5 LastName is User5 Gender is M Status is NOTHING GENDER ARG =>null< STATUS ARG =><
2021-12-29 22:19:30.669 D/USERINFO_RUN3: FirstName is User6 LastName is User6 Gender is F Status is NOTHING GENDER ARG =>null< STATUS ARG =><
2021-12-29 22:19:30.671 D/USERINFO_RUN4: FirstName is User2 LastName is User2 Gender is F Status is OLD GENDER ARG =>F< STATUS ARG =>null<
2021-12-29 22:19:30.671 D/USERINFO_RUN4: FirstName is User4 LastName is User4 Gender is F Status is NEW GENDER ARG =>F< STATUS ARG =>null<
2021-12-29 22:19:30.672 D/USERINFO_RUN4: FirstName is User6 LastName is User6 Gender is F Status is NOTHING GENDER ARG =>F< STATUS ARG =>null<
2021-12-29 22:19:30.675 D/USERINFO_RUN5: FirstName is User1 LastName is User1 Gender is M Status is NEW GENDER ARG =>< STATUS ARG =>NEW<
2021-12-29 22:19:30.675 D/USERINFO_RUN5: FirstName is User4 LastName is User4 Gender is F Status is NEW GENDER ARG =>< STATUS ARG =>NEW<
2021-12-29 22:19:30.678 D/USERINFO_RUN7: FirstName is User1 LastName is User1 Gender is M Status is NEW GENDER ARG =>null< STATUS ARG =>null<
2021-12-29 22:19:30.679 D/USERINFO_RUN7: FirstName is User2 LastName is User2 Gender is F Status is OLD GENDER ARG =>null< STATUS ARG =>null<
2021-12-29 22:19:30.679 D/USERINFO_RUN7: FirstName is User3 LastName is User3 Gender is M Status is OLD GENDER ARG =>null< STATUS ARG =>null<
2021-12-29 22:19:30.679 D/USERINFO_RUN7: FirstName is User4 LastName is User4 Gender is F Status is NEW GENDER ARG =>null< STATUS ARG =>null<
2021-12-29 22:19:30.679 D/USERINFO_RUN7: FirstName is User5 LastName is User5 Gender is M Status is NOTHING GENDER ARG =>null< STATUS ARG =>null<
2021-12-29 22:19:30.679 D/USERINFO_RUN7: FirstName is User6 LastName is User6 Gender is F Status is NOTHING GENDER ARG =>null< STATUS ARG =>null<
  • Related