5

The method getAllActivities() must return all activities from database in array list format But I got: java.lang.NumberFormatException: Invalid int: "null", at activity.setActivityType(Integer.parseInt(cursor.getString(1))); I don't know what is wrong

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
import com.yast.util.Constants;
import com.yast.util.Utils;
import java.util.ArrayList;
import java.util.List;


public class DatabaseHandler extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "YastDB.db";

    // Activities table name
    private static final String TABLE_ACTIVITIES = "Activities";

    // Activities Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_ACTIVITYTYPE = "ActivityType";
    private static final String KEY_HARTRATE = "HartRate";
    private static final String KEY_HARTBATNO = "HartBatNo";
    private static final String KEY_DISTANCE = "Distance";
    private static final String KEY_SPEED = "Speed";
    private static final String KEY_STRIDES = "Strides";
    private static final String KEY_STARTDATETIME = "StartDateTime";
    private static final String KEY_ENDDATETIME = "EndDateTime";
    public static final String  KEY_CURRENTDATETIME = "CurrentDateTime";

    private String[] PROJECTION = new String[]{ KEY_ID,
            KEY_ACTIVITYTYPE, KEY_HARTRATE,KEY_HARTBATNO, KEY_DISTANCE,
            KEY_SPEED,KEY_STRIDES,KEY_STARTDATETIME,KEY_ENDDATETIME
            ,KEY_CURRENTDATETIME};

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

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_Activitys_TABLE = "CREATE TABLE " + TABLE_ACTIVITIES + "("
                + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                KEY_ACTIVITYTYPE + " INTEGER,"+
                KEY_HARTRATE + " INTEGER, "+
                KEY_HARTBATNO + " INTEGER,"+
                KEY_DISTANCE + " INTEGER," +
                KEY_SPEED + " INTEGER," +
                KEY_STRIDES + " INTEGER," +
                KEY_STARTDATETIME + " TEXT," +
                KEY_ENDDATETIME + " TEXT," +
                KEY_CURRENTDATETIME + " TEXT" +
                ")";
        db.execSQL(CREATE_Activitys_TABLE);
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_ACTIVITIES);

        // Create tables again
        onCreate(db);
    }

    //CRUD operations (Create, Read, Update and Delete)
    // Adding new activity
    public void addActivity(ActivityEntity activity) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_ACTIVITYTYPE, activity.getActivityType()); // Activity type
        values.put(KEY_HARTRATE, activity.getHartRate());
        values.put(KEY_HARTBATNO, activity.getHartBatNo());
        values.put(KEY_DISTANCE, activity.getDistance());
        values.put(KEY_SPEED, activity.getSpeed());
        values.put(KEY_STRIDES, activity.getStrides());
        values.put(KEY_STARTDATETIME,activity.getStartDateTime().toString());
        values.put(KEY_ENDDATETIME, activity.getEndDateTime().toString());
        values.put(KEY_CURRENTDATETIME, activity.getCurrentDateTime().toString());

        // Inserting Row
        db.insert(TABLE_ACTIVITIES, null, values);
        db.close(); // Closing database connection

    }

    // Getting single Activity
    /*
    The following method getActivity() will read single contact row.
    It accepts id as parameter and will return the matched row from the database.
     */
    public ActivityEntity getActivity(int id) {
        ActivityEntity activity = null;
        SQLiteDatabase db = this.getReadableDatabase();

        String where = KEY_ID + "=?";
        String[] selectionArg = new String[]{String.valueOf(id)};

        Cursor cursor = db.query(TABLE_ACTIVITIES, PROJECTION, where, selectionArg,
 null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();

            activity = new ActivityEntity(Integer.parseInt(cursor.getString(0)),
                    Integer.parseInt(cursor.getString(1)),
                    Integer.parseInt(cursor.getString(2)),
                    Integer.parseInt(cursor.getString(3)),
                    Integer.parseInt(cursor.getString(4)),
                    Integer.parseInt(cursor.getString(5)),
                    Integer.parseInt(cursor.getString(6)),
                    cursor.getString(7),
                    cursor.getString(8),
                    cursor.getString(9));
        }
        return activity;
    }

    // Getting All Activities
    public ArrayList<ActivityEntity> getAllActivitys() {

        ArrayList<ActivityEntity> activitiesList = new ArrayList<ActivityEntity>();
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.query(TABLE_ACTIVITIES, PROJECTION, null, null, null, null, null, null);

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                ActivityEntity activity = new ActivityEntity();
                activity.setID(Integer.parseInt(cursor.getString(0)));
                activity.setActivityType(Integer.parseInt(cursor.getString(1)));
                activity.setHartRate(Integer.parseInt(cursor.getString(2)));
                activity.setHartBatNo(Integer.parseInt(cursor.getString(3)));
                activity.setDistance(Integer.parseInt(cursor.getString(4)));
                activity.setSpeed(Integer.parseInt(cursor.getString(5)));
                activity.setStrides(Integer.parseInt(cursor.getString(6)));
                activity.setStartDateTime(cursor.getString(7));
                activity.setEndDateTime(cursor.getString(8));
                activity.set_currentDateTime(cursor.getString(9));

                // Adding activity to list
                activitiesList.add(activity);
            } while (cursor.moveToNext());

        }
        return activitiesList;
    }


    public int getActivitiesCount() {

        String countQuery = "SELECT  * FROM " + TABLE_ACTIVITIES;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        cursor.close();

        // return count
        return cursor.getCount();
    }

    // Updating single Activity
    public int updateActivity(ActivityEntity activity) {
            SQLiteDatabase db = this.getWritableDatabase();

            String where = KEY_ID + "=?";

            ContentValues values = new ContentValues();
            values.put(PROJECTION[1], activity.getActivityType());
            values.put(PROJECTION[2], activity.getHartRate());
            values.put(PROJECTION[3], activity.getHartBatNo());
            values.put(PROJECTION[4], activity.getDistance());
            values.put(PROJECTION[5], activity.getSpeed());
            values.put(PROJECTION[6], activity.getStrides());
            values.put(PROJECTION[7], activity.getStartDateTime().toString());
            values.put(PROJECTION[8], activity.getEndDateTime().toString());
            values.put(PROJECTION[9], activity.getCurrentDateTime().toString());


            // updating row
            return db.update(TABLE_ACTIVITIES, values, where, new String[] { String.valueOf(activity.getID()) });
    }

    public void deleteActivity(ActivityEntity activity)
    {
        String where = KEY_ID + "=?";

        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_ACTIVITIES, where,
                new String[] { String.valueOf(activity.getID()) });
        db.close();
    }

    public void bulkInsert(ArrayList<ActivityEntity> arrayOfActivities) {
        SQLiteDatabase db = this.getWritableDatabase();
        String sql = "INSERT INTO "+ TABLE_ACTIVITIES +" VALUES (?,?,?,?,?,?,?,?,?,?);";
        SQLiteStatement statement = db.compileStatement(sql);
        db.beginTransaction();
       for (ActivityEntity a : arrayOfActivities ) {
            statement.clearBindings();
            statement.bindLong(1, (long) a.getID());
            statement.bindLong(2, (long) a.getActivityType());
            statement.bindLong(3, (long) a.getHartRate());
            statement.bindLong(4, (long) a.getHartBatNo());
            statement.bindLong(5, (long) a.getDistance());
            statement.bindLong(6, (long) a.getSpeed());
            statement.bindLong(7, (long) a.getStrides());
            statement.bindString(8, a.getStartDateTime());
            statement.bindString(9, a.getEndDateTime());
            statement.bindString(10,a.getCurrentDateTime());

            statement.clearBindings();
            statement.execute();
        }
        db.setTransactionSuccessful();
        db.endTransaction();
    }


}

ActivityEntity.java calss:

import com.yast.util.Constants;
import com.yast.util.Utils;
import java.util.Date;

public class ActivityEntity {

    int id;
    int activityType;
    int hartRate;
    int hartBatNo;
    int distance;
    int speed;
    int strides;
    String startDateTime;
    String endDateTime;
    String currentDateTime;

    public ActivityEntity(){

    }
    // constructor
    public ActivityEntity(int Id, int activityType, int hartRate, int _hartBatNo, int distance, int speed, int strides, String startDateTime, String endDateTime, String currentDateTime){
        this.id = Id;
        this.activityType = activityType;
        this.hartRate = hartRate;
        this.hartBatNo = _hartBatNo;
        this.distance = distance;
        this.speed = speed;
        this.strides = strides;
        this.startDateTime = startDateTime;
        this.endDateTime = endDateTime;
        this.currentDateTime = currentDateTime;
    }
    public void setID(int id){
        this.id = id;
    }
    public int getID(){
        return this.id;
    }
    public void setActivityType(int activityType){
        this.activityType = activityType;
    }
    public int getActivityType(){
        return this.activityType;
    }
    public void setHartRate(int hartRate){
        this.hartRate = hartRate;
    }

    public int getHartRate(){
        return this.hartRate;
    }
    public void setHartBatNo(int hartBatNo){
        this.hartBatNo = hartBatNo;
    }
    public int getHartBatNo(){
        return this.hartBatNo;
    }

    public void setDistance(int distance){
        this.distance = distance;
    }

    public int getDistance(){
        return this.distance;
    }

    public void setSpeed(int speed){
        this.speed = speed;
    }

    public int getSpeed(){
        return this.speed;
    }

    public void setStrides(int strides){
        this.strides = strides;
    }

    public int getStrides(){
        return this.strides;
    }

    public void setStartDateTime(String startDateTime){
        this.startDateTime = startDateTime;
    }

    public String getStartDateTime(){
        return this.startDateTime;
    }

    public void setEndDateTime(String endDateTime){
        this.endDateTime = endDateTime;
    }

    public String getEndDateTime(){
        return this.endDateTime;
    }

    public void set_currentDateTime(String currentDateTime){
        this.currentDateTime = currentDateTime;
    }
    public String getCurrentDateTime(){
        return this.currentDateTime;
    }

    @Override
    public String toString() {
        return "ActivityEntity{" +
                "id=" + id +
                ", activityType=" + activityType +
                ", hartRate=" + hartRate +
                ", hartBatNo=" + hartBatNo +
                ", distance=" + distance +
                ", speed=" + speed +
                ", strides=" + strides +
                ", startDateTime='" + startDateTime + '\'' +
                ", endDateTime='" + endDateTime + '\'' +
                ", currentDateTime='" + currentDateTime + '\'' +
                '}';
    }
}
0

9 Answers 9

4

in your code, if cursor.getString(int num) returns null, then Integer.parseInt(String str) will throw NumberFormatException.

To avoid this, you should have check for what the cursor.getString(int num) returns.

OR, you can use try-catch and print the appropriate message in catch if you'll get NumberFormatException.

Sign up to request clarification or add additional context in comments.

Comments

4

You should check your cursor value is null or not.

if(cursor.isNull(column))
{
//Value is null
}else{

return cursor.getString(column);

}

1 Comment

this way you pay twice the price :)
3

Before you convert the value to Integer, you have to check whether the value is integer or not. If it is not an integer then replace it to default integer.

activity.setActivityType(Integer.parseInt(nulltoIntegerDefalt(cursor.getString(1))));
activity.setActivityType(Integer.parseInt(nulltoIntegerDefalt(cursor.getString(1))));
activity.setHartRate(Integer.parseInt(nulltoIntegerDefalt(cursor.getString(2))));
activity.setHartBatNo(Integer.parseInt(nulltoIntegerDefalt(cursor.getString(3))));
activity.setDistance(Integer.parseInt(nulltoIntegerDefalt(cursor.getString(4))));
activity.setSpeed(Integer.parseInt(nulltoIntegerDefalt(cursor.getString(5))));
activity.setStrides(Integer.parseInt(nulltoIntegerDefalt(cursor.getString(6))));

 String nulltoIntegerDefalt(String value){
    if(!isIntValue(value)) value="0";
    return value;

}

boolean isIntValue(String val)
{
    try {
        val=val.replace(" ","");
        Integer.parseInt(val);
    } catch (Exception e) {return false;}
    return true;
}

Comments

2

"null" isn't a valid int. Check for null first.

2 Comments

Yes, I know. But I dont now why/ or from where take "null" value. Theoretically should take an Int value, that's I was try to do
The column in the database for that row is null. And you're trying to retrieve it as a string, not an int.
1

You need to be more careful checking for nullness:

1) cursor itself could be null

2) cursor.getString(1) could be null

Putting this together:

if (cursor != null && cursor.getString(1) != null){
    /*your parse will be safe here*/
}

Note that I'm exploiting the fact that an if will evaluate from left to right and will stop evaluation once the result is known.

As an optimisation, you might want to store the result of cursor.getString(1) to prevent your having to evaluate this twice. But get the code working first.

3 Comments

1) No, because you'd get an NPE on cursor.getString(1).
@DaveNewton Java's && short circuits, so this will not happen. In any case, SQLiteDatabase.query never returns null.
@CL. In the OP's question, cursor isn't null, and that was what I was responding to. Bathsheba's answer is intended to be general-purpose, I'm saying it's not the case in the original question. I'm aware of Java's expression execution particulars, but thank you.
0

Cursor cursor = db.query(TABLE_ACTIVITIES, PROJECTION, null, null, null, null, null, null);

Your SQL query string, the first null input in the query method, is null. You have not provided a query. I am assuming you want all columns from the table, so perhaps fill the query like:

String SQLSTATEMENT = "SELECT " + KEY_ID + "," + KEY_ACTIVITYTYPE + "," KEY_HARTRATE + "," KEY_HARTBATNO + "," KEY_DISTANCE + "," KEY_SPEED,KEY_STRIDES + "," KEY_STARTDATETIME + "," KEY_ENDDATETIM + "," KEY_CURRENTDATETIME;

Cursor cursor = db.query(TABLE_ACTIVITIES, PROJECTION, SQLSTATEMENT, null, null, null, null, null);

Comments

0
activity.setActivityType(Integer.parseInt(cursor.getString(1)));

in this cursor.getString(1) is getting null and That is why you are getting null pointer exception. Check for that String value.

1 Comment

Not getting an NPE, but a NumberFormatException.
0

The problem should be solved now, so I'm just solving the exception

An easier way is to change if(){}else{}" by "try{}catch(Exception e){}

Example :

try { 
//Avoid/Éviter (FATAL EXCEPTION: main java.lang.NumberFormatException: Invalid int: "")

//exemple / Exemple d'action

    int userWeight = Integer.parseInteger(userData);
    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
    intent.putExtra("weight", userWeight);  

//                control Toast/Toast de contrôle
    Toast.makeText(MainActivity.this, "OK", Toast.LENGTH_LONG).show();

}
catch (Exception e) {
    Toast.makeText(MainActivity.this, "not OK", Toast.LENGTH_LONG).show();
}

Comments

0

Thanks to @user3091530 answer. I have used my own ParsInt method. Create a class named Math.

public class Math {

    //Checking the value if null return zero
    public int ParsIntOrDefalt(String value){
        return Integer.parseInt(NullIntegerDefalt(value));
    }

    private String NullIntegerDefalt(String value) {
        if (!isIntValue(value)) value = "0";
        return value;
    }

    private boolean isIntValue(String val){
        try {
            val=val.replace(" ","");
            Integer.parseInt(val);
        } catch (Exception e) {return false;}
        return true;
    }
}

So, we can use it instead of the main Integer.parseInt() method:

Math math = new Math();
activity.setActivityType(math.ParsIntOrDefalt(cursor.getString(1)));

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.