2012-05-19 3 views
0

J'ai suivi ce tutoriel this tutorial et configurer mes bases de données et l'activité principale pour s'adapter au tutoriel. Et je reçois une erreur:Android populate bouton radio à partir d'une table de base de données

E/AndroidRuntime(281): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxx.xxx/com.xxx.xxx.Tamar_appActivity}: java.lang.NullPointerException

Le code Tamar_appActivity est:

 DatBas db = new DatBas(this); 
    TamarDatabaseCursor c = db.getActress(); 

    if (c.moveToFirst()) 
     DisplayRadioButton(c); 
    else 
     Toast.makeText(this, "No title found", Toast.LENGTH_LONG).show(); 
    db.close(); 

} 

public void DisplayRadioButton(Cursor c) { 
    for (int i = 1; i < (c.getColumnCount()); i++) { 
     RadioGroup radiogroup = (RadioGroup)  findViewById(R.id.NameSelectGroup); 
     RadioButton rdbtn = new RadioButton(this); 
     rdbtn.setId(i); 
     rdbtn.setText(c.getString(i)); 
     radiogroup.addView(rdbtn); 
    } 

} 

Et le Code datbase est:

public class DatBas { 


public static final String KEY_ROW_ID = "_id"; 
public static final String KEY_IMAGE_PATH = "uri"; 
public static final String KEY_NAME = "name"; 
public static final String KEY_GENDER = "gender"; 
public static final String KEY_BORN_DATE_YEAR = "age_year"; 
public static final String KEY_BORN_DATE_MONTH = "age_month"; 
public static final String KEY_BORN_DATE_DAY = "age_day"; 

private static final String DATABASE_NAME = "TamatDB"; 
private static final String DATABASE_TABLE_SETTINGS = "settings"; 

private static final int DATABASE_VERSION = 20; 

private TamarDatabase thdb; 
private static Context tcontext; 
private SQLiteDatabase tdb; 

private static class TamarDatabase extends SQLiteOpenHelper { 

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

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String ctSettings = "CREATE TABLE " + DATABASE_TABLE_SETTINGS 
       + " (" + KEY_ROW_ID 
       + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
       + KEY_IMAGE_PATH + " TEXT NOT NULL, " + KEY_NAME 
       + " TEXT NOT NULL, " + KEY_GENDER + " TEXT NOT NULL, " 
       + KEY_BORN_DATE_YEAR + " TEXT NOT NULL, " 
       + KEY_BABY_DATE_MONTH + " TEXT NOT NULL, " 
       + KEY_BABY_DATE_DAY + " TEXT NOT NULL);"; 
     db.execSQL(ctSettings); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_SETTINGS); 
     onCreate(db); 
    } 
} 

public DatBas(Context c) { 
    tcontext = c; 
} 

public DatBas open() throws SQLiteException { 
    thdb = new TamarDatabase(tcontext); 
    tdb = thdb.getWritableDatabase(); 
    return this; 
} 

public void close() { 
    thdb.close(); 
} 

public long createEntrySettings(String bbdy, String bbdm, String bbdd, 
     String pt, String bg, String bfName) { 
    ContentValues cv2 = new ContentValues(); 
    cv2.put(KEY_IMAGE_PATH, pt); 
    cv2.put(KEY_NAME, bfName); 
    cv2.put(KEY_GENDER, bg); 
    cv2.put(KEY_BORN_DATE_YEAR, bbdy); 
    cv2.put(KEY_BORN_DATE_MONTH, bbdm); 
    cv2.put(KEY_BORN_DATE_DAY, bbdd); 

    return tdb.insert(DATABASE_TABLE_SETTINGS, null, cv2); 
} 

public Cursor getDataSettings() { 
    String[] columns = new String[] { KEY_ROW_ID, KEY_IMAGE_PATH, 
      KEY_NAME, KEY_GENDER, KEY_BORN_DATE_YEAR, 
      KEY_BORN_DATE_MONTH, KEY_BORN_DATE_DAY }; 
    Cursor c = tdb.query(DATABASE_TABLE_SETTINGS, columns, null, null, 
      null, null, null); 
    String results = ""; 

    int iRawId = c.getColumnIndex(KEY_ROW_ID); 
    int iBIPath = c.getColumnIndex(KEY_IMAGE_PATH); 
    int iBName = c.getColumnIndex(KEY_NAME); 
    int iGender = c.getColumnIndex(KEY_GENDER); 
    int iBBDateYear = c.getColumnIndex(KEY_BORN_DATE_YEAR); 
    int iBBDateMonth = c.getColumnIndex(KEY_BORN_DATE_MONTH); 
    int iBBDateDay = c.getColumnIndex(KEY_BORN_DATE_DAY); 

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 
     results = results + " the kind is " + " " + c.getString(iRawId) 
       + " the kind is " + " " + c.getString(iBIPath) 
       + " the kind is " + " " + c.getString(iBName) 
       + " the kind is " + " " + c.getString(iGender) 
       + " the kind is " + " " + c.getString(iBBDateYear) 
       + " the kind is " + " " + c.getString(iBBDateMonth) 
       + " the kind is " + " " + c.getString(iBBDateDay) + "\n"; 
    } 
    return c; 
} 

public String getDataSettingsBabyName() { 
    String[] columns = new String[] { KEY_ROW_ID, KEY_NAME}; 
    Cursor c = tdb.query(DATABASE_TABLE_SETTINGS, columns, null, null, 
      null, null, null); 
    String results = ""; 

    int iRawId = c.getColumnIndex(KEY_ROW_ID); 
    int iBName = c.getColumnIndex(KEY_NAME); 

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 
     String[] resultsS = new String[]{c.getString(iRawId), c.getString(iBName)  
     }; 
    } 
    return results; 
} 




public static class TamarDatabaseCursor extends SQLiteCursor{ 

    /** The query for this cursor */ 
    private static final String QUERY = 
     "SELECT _id, uri, baby_name, gender, age_year, age_month, age_day" + 
     " FROM settings"; 

    /** Cursor constructor */ 
    private TamarDatabaseCursor(SQLiteDatabase db, SQLiteCursorDriver driver, 
      String editTable, SQLiteQuery query) { 
     super(db, driver, editTable, query); 
    } 
    /** Private factory class necessary for rawQueryWithFactory() call */ 

    private static class Factory implements SQLiteDatabase.CursorFactory{ 
     public Cursor newCursor(SQLiteDatabase db, 
       SQLiteCursorDriver driver, String editTable, 
       SQLiteQuery query) { 
      return new TamarDatabaseCursor(db, driver, editTable, query); 
     } 
    } 
    /* Accessor functions get one per database column */ 

    public int getActressId(){return getInt(getColumnIndexOrThrow("actress.actressId"));} 

} 



public TamarDatabaseCursor getActress() 
{ 
SQLiteDatabase d = getReadableDatabase(); 
TamarDatabaseCursor c = (TamarDatabaseCursor)d.rawQueryWithFactory 
     (new TamarDatabaseCursor.Factory(), TamarDatabaseCursor.QUERY, null, null); 
c.moveToFirst(); 
return c; 
} 



private SQLiteDatabase getReadableDatabase() { 
    // TODO Auto-generated method stub 
    return null; 
} 

public DatBas delete() { 
    tdb.delete(DATABASE_TABLE, null, null); 
    tdb.delete(DATABASE_TABLE_SETTINGS, null, null); 
    return null; 
} 
} 

Le XML principal est:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="#3691c9" 
android:orientation="vertical" > 

<RadioGroup 
    android:id="@+id/sideGroup" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:weightSum="100" > 

    <RadioButton 
     android:id="@+id/rbtnLeft" 
     android:layout_width="160dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_weight="50" 
     android:text="xxx" /> 

    <RadioButton 
     android:id="@+id/rbtnRight" 
     android:layout_width="160dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_weight="50" 
     android:text="xxx" /> 
</RadioGroup> 

<RadioGroup 
    android:id="@+id/kindGroup" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:weightSum="100" > 

    <RadioButton 
     android:id="@+id/rbtnN" 
     android:layout_width="160dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_weight="50" 
     android:text="xxx" /> 

    <RadioButton 
     android:id="@+id/rbtnP" 
     android:layout_width="160dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_weight="50" 
     android:text="xxx" /> 
</RadioGroup> 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:text="TextView" 
    android:textColor="#363636" 
    android:textSize="25dp" /> 

<TextView 
    android:id="@+id/textView2" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:text="TextView" 
    android:textColor="#363636" 
    android:textSize="40dp" 
    android:textStyle="bold" /> 

<Button 
    android:id="@+id/button2" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Start" /> 

<Button 
    android:id="@+id/button3" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Pause" /> 

<Button 
    android:id="@+id/Button4" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Resume" /> 

<Button 
    android:id="@+id/button1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Stop" /> 

<RadioGroup 
    android:id="@+id/NameSelectGroup" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 

    <RadioButton 
     android:id="@+id/bNameSelect" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:text="RadioButton" /> 
</RadioGroup> 

<ImageButton 
    android:id="@+id/imageButton1" 
    android:layout_width="38dp" 
    android:layout_height="37dp" 
    android:src="@android:drawable/ic_menu_manage" /> 

<ImageView 
    android:id="@+id/imageView1" 
    android:layout_width="160dp" 
    android:layout_height="160dp" 
    android:layout_gravity="center" 
    android:src="@android:drawable/gallery_thumb" /> 

</LinearLayout> 
+0

Qu'est-ce que la ligne 281? –

+0

RadioGroup radiogroup = (RadioGroup) findViewById (R.id.NameSelectGroup); – Dori

+0

J'ai regardé le tutoriel et mon avis est que c'est un très mauvais tutoriel. Par exemple, l'instruction select: 'SELECT actressId, actress1, actress2, actress3, actress4 DE l'actrice;' Je préfère passer à autre chose et trouver autre chose. À l'heure actuelle Googling SQLite android et le bouton radio conduit souvent à ce mauvais tutoriel. –

Répondre

0

Je voudrais hazar d une estimation que findViewById(R.id.babyNameSelectGroup); renvoie null, et lorsque vous essayez de radiogroup.addView(rdbtn); vous obtenez le NPE.

Avez-vous fait setContentView(R.layout.yourmainlayout); avant d'essayer d'accéder à une vue contenue dans votre mise en page?

EDIT

Votre recherchent babyNameSelectGroup, qui ne semble pas exister dans votre mise en page (vous donnant ainsi la NPE). Peut-être que cela devrait être NameSelectGroup?

+0

oui j'ai défini le mainLayout: \t public void onCreate (Bundle savedInstanceState) { \t \t super.onCrée (savedInstanceState); \t \t setContentView (R.layout.main); – Dori

+0

OK. Que diriez-vous de poster le XML qui contient 'NameSelectGroup'? – Barak

+0

Que voulez-vous dire par "post"? – Dori

0

J'ai dû mettre une méthode getReadableDatabase():

public SQLiteDatabase getReadableDatabase() throws SQLiteException { 
    thdb = new TamarDatabase(tcontext); 
    tdb = thdb.getReadableDatabase(); 
    return tdb; 
} 
Questions connexes