0

I am making a small app and therefore i need to use a small SQLite-database.

Please help me, i dont know how to fix this error:

At the line "SQLiteDatabase db = this.getReadableDatabase();" in the database , (Main: int teams = db.countAllTeams())

Error: W/System.err﹕ Invalid int: ""

Database:

public class DatabaseHelper extends SQLiteOpenHelper {

  private static final int DATABASE_VERSION = 1;
  private static final String DATABASE_NAME = "database";
  private static final String TABLE_TEAM = "team";

  private static final String KEY_TEAM_FULLNAME = "full_name";
  private static final String KEY_TEAM_SHORTNAME = "short_name";
  private static final String KEY_TEAM_STADIUM = "stadium";
  private static final String KEY_TEAM_LOGO = "logo";

  private static final String CREATE_TABLE_TEAM = "CREATE TABLE "
        + TABLE_TEAM + "(" + KEY_TEAM_FULLNAME + " TEXT PRIMARY KEY," +
                             KEY_TEAM_SHORTNAME + " TEXT," +
                             KEY_TEAM_STADIUM + " TEXT," +
                             KEY_TEAM_LOGO + " INTEGER" + ")";


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

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE_TEAM);
}

@Override
public void onUpgrade(SQLiteDatabase db, int old, int neW) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_TEAM);
    onCreate(db);
}

public void closeDB() {
    SQLiteDatabase db = this.getReadableDatabase();
    if (db != null && db.isOpen()) db.close();
}

public long createTeam(Team team) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_TEAM_FULLNAME, team.getFullName());
    values.put(KEY_TEAM_SHORTNAME, team.getShortName());
    values.put(KEY_TEAM_LOGO, team.getLogo());
    values.put(KEY_TEAM_STADIUM, team.getStadium());

    return db.insert(TABLE_TEAM, null, values);
}

public int countAllTeams(){
    SQLiteDatabase db = this.getReadableDatabase();
    List<Team> teams = new ArrayList<Team>();

    return Integer.getInteger(db.compileStatement("SELECT COUNT(*) FROM " + TABLE_TEAM).simpleQueryForString());
}

}

Main

DatabaseHelper db;
TextView tvText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_home);

    tvText = (TextView)findViewById(R.id.tvText);
    String text = "";

    db = new DatabaseHelper(getApplicationContext());
    int teams = db.countAllTeams();

    tvText.setText(teams);
}
}
Bene
  • 874
  • 1
  • 10
  • 15
  • `Integer.getInteger(..)`? Are you sure that you want this method and not `Integer.valueOf(..)` or `Integer.parseInt(..)` instead? `.getInteger()` reads system properties (according to the java doc). – Tom Oct 18 '14 at 21:23

3 Answers3

1

Integer.getInteger does not convert a string to an integer. The easiest way to get a single number from a query is to use DatabaseUtils:

long count = DatabaseUtils.longForQuery(db,
                "SELECT COUNT(*) FROM " + TABLE_TEAM, null);

But to get the number of rows in the table, there's an even simpler function:

long count = DatabaseUtils.queryNumEntries(db, TABLE_TEAM);

Furthermore, when you give an integer to TextView.setText, it expects a resource ID. You have to convert your count into a string manually:

tvText.setText(Integer.toString(teams));
CL.
  • 173,858
  • 17
  • 217
  • 259
0

.setText doesn't take in integers directly, instead try:

tvText.setText(String.valueOf(teams));

Integer value in TextView

Community
  • 1
  • 1
Jeppe
  • 1,830
  • 3
  • 24
  • 33
0

I'd use rawQuery() instead of simpleQueryForString():

public int countAllTeams(){
    SQLiteDatabase db = this.getReadableDatabase();
    List<Team> teams = new ArrayList<Team>();

    Cursor c = db.rawQuery("SELECT COUNT(*) FROM " + TABLE_TEAM, new String[]{});
    c.moveToFirst();

    return c.getInt(0);
}
Trinimon
  • 13,839
  • 9
  • 44
  • 60