omar344 Posté(e) 26 décembre 2011 Share Posté(e) 26 décembre 2011 salut tt le monde, je suis un debutant sur android, et je suis entrain de créer une application qui utilise une base de données pré-remplie, mais j'ai une erreur dont je connais pas la source, mon code est le suivant: MainActivity.java: public class MainActivity extends TabActivity { Cursor model = null; TerrainAdapter adapter = null; TextView nom = null; TextView prenom = null; TextView fonction = null; terrainHelper helper = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); helper = new terrainHelper(this); nom = (TextView) findViewById(R.id.nom); prenom = (TextView) findViewById(R.id.prenom); fonction = (TextView) findViewById(R.id.fonction); ListView list = (ListView) findViewById(R.id.terrains); model = helper.getAll(); startManagingCursor(model); adapter = new TerrainAdapter(model); list.setAdapter(adapter); TabHost.TabSpec spec = getTabHost().newTabSpec("tag1"); spec.setContent(R.id.terrains); spec.setIndicator("List", getResources().getDrawable(R.drawable.list)); getTabHost().addTab(spec); spec = getTabHost().newTabSpec("tag2"); spec.setContent(R.id.details); spec.setIndicator("Details", getResources().getDrawable(R.drawable.terrain)); getTabHost().addTab(spec); getTabHost().setCurrentTab(0); list.setOnItemClickListener(onListClick); } @Override public void onDestroy() { super.onDestroy(); helper.close(); } private AdapterView.OnItemClickListener onListClick = new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { model.moveToPosition(position); nom.setText(helper.getNom(model)); prenom.setText(helper.getPrenom(model)); fonction.setText(helper.getFonction(model)); getTabHost().setCurrentTab(1); } }; class TerrainAdapter extends CursorAdapter { TerrainAdapter(Cursor c) { super(MainActivity.this, c); } @Override public void bindView(View row, Context ctxt, Cursor c) { TerrainHolder holder = (TerrainHolder) row.getTag(); holder.populateFrom(c, helper); } @Override public View newView(Context ctxt, Cursor c, ViewGroup parent) { LayoutInflater inflater = getLayoutInflater(); View row = inflater.inflate(R.layout.row, parent, false); TerrainHolder holder = new TerrainHolder(row); row.setTag(holder); return (row); } } static class TerrainHolder { private TextView ville = null; private TextView tache = null; TerrainHolder(View row) { ville = (TextView) row.findViewById(R.id.ville); tache = (TextView) row.findViewById(R.id.tache); } void populateFrom(Cursor c, terrainHelper helper) { ville.setText(helper.getNom(c)); tache.setText(helper.getFonction(c)); } } } terrainHelper.java class terrainHelper extends SQLiteOpenHelper { //Le path des bases du system Android (attention au nom du package de l'appli). private static String DB_PATH = "/data/data/com.abouchan.docs/databases/"; //nom de la base private static String DB_NAME = "db.sqlite3"; // la base private SQLiteDatabase myDataBase; // le context private final Context myContext; /** * Constructeur * * @param context */ public terrainHelper(Context context) { super(context, DB_NAME, null, 2); this.myContext = context; } /** * On cré une base vide dans le system Android et on réécris dessus. * */ public void createDataBase() throws IOException { boolean dbExist = checkDataBase(); if (dbExist) { //On fait rien - La base existe déja. } else { //By calling this method and empty database will be created into the default system path //of your application so we are gonna be able to overwrite that database with our database. this.getReadableDatabase(); try { //Copie de la base copyDataBase(); } catch (IOException e) { throw new Error("Erreur de copie de la base !"); } } } /** * On Check la base pour voir si elle existe ou pas * * @return true si la base existe, false si elle existe pas. */ private boolean checkDataBase() { SQLiteDatabase checkDB = null; try { String myPath = DB_PATH + DB_NAME; checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); } catch (SQLiteException e) { //database does't exist yet. } if (checkDB != null) { checkDB.close(); } return checkDB != null ? true : false; } /* (non-Javadoc) * @see android.database.sqlite.SQLiteOpenHelper#getReadableDatabase() */ @Override public synchronized SQLiteDatabase getReadableDatabase() { return super.getReadableDatabase(); } /** * On copie la base depuis le dossier assets dans le dossier system des bases sous android dans la base vide fraichement créé. * * */ private void copyDataBase() throws IOException { //On ouvre la base locale InputStream myInput = myContext.getAssets().open(DB_NAME); // On choisi l'endroit String outFileName = DB_PATH + DB_NAME; //On ouvre la base vide OutputStream myOutput = new FileOutputStream(outFileName); //On transfert... byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } //On ferme ... myOutput.flush(); myOutput.close(); myInput.close(); } /** *Fonction pour acceder à la base en mode lecture seul **/ public void openDataBase() throws SQLException { //Open the database String myPath = DB_PATH + DB_NAME; myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS); } @Override public synchronized void close() { if (myDataBase != null) { myDataBase.close(); } super.close(); } @Override public void onCreate(SQLiteDatabase db) { // On ne crées pas de base } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // pas de mis a jour } // developper vos methodes d'acces à la base que vous appelerez dans la Main ETC.... public Cursor getAll() { return (myDataBase.rawQuery("SELECT nom, prenom, fonction FROM terrain ORDER BY nom ASC", null)); } public String getNom(Cursor c) { return (c.getString(1)); } public String getPrenom(Cursor c) { return (c.getString(2)); } public String getFonction(Cursor c) { return (c.getString(3)); } } mon logcat: ERROR AndroidRuntime FATAL EXCEPTION: main ERROR AndroidRuntime java.lang.RuntimeException: Unable to start activity ComponentInfo{com.abouchan.docs/com.abouchan.docs.MainActivity}: java.lang.NullPointerException ERROR AndroidRuntime at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1664) ERROR AndroidRuntime at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1680) ERROR AndroidRuntime at android.app.ActivityThread.access$1500(ActivityThread.java:117) ERROR AndroidRuntime at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) ERROR AndroidRuntime at android.os.Handler.dispatchMessage(Handler.java:99) ERROR AndroidRuntime at android.os.Looper.loop(Looper.java:130) ERROR AndroidRuntime at android.app.ActivityThread.main(ActivityThread.java:3703) ERROR AndroidRuntime at java.lang.reflect.Method.invokeNative(Native Method) ERROR AndroidRuntime at java.lang.reflect.Method.invoke(Method.java:507) ERROR AndroidRuntime at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) ERROR AndroidRuntime at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) ERROR AndroidRuntime at dalvik.system.NativeStart.main(Native Method) ERROR AndroidRuntime Caused by: java.lang.NullPointerException ERROR AndroidRuntime at com.abouchan.docs.terrainHelper.getAll(terrainHelper.java:166) ERROR AndroidRuntime at com.abouchan.docs.MainActivity.onCreate(MainActivity.java:54) ERROR AndroidRuntime at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) ERROR AndroidRuntime at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1628) ERROR AndroidRuntime ... 11 more Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 3 janvier 2012 Share Posté(e) 3 janvier 2012 Comme l'indiquent les logs, tu as un NullPointerException dans la méthode getAll de terrainHelper, visiblement parce que l'attribut myDatabase de terrainHelper n'a pas été initialisé. Il faudrait sans doute que tu appelles par ex openDatabase avant d'appeler getAll ... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.