Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  4 1485
Har et problem som jeg ikke skjønner hvordan oppstår, eller hvordan jeg skal få fikset. Regner med at det kanskje bare er en nybegynnerfeil som er lett å se for et trent øye. Det som skjer er at appen kræsjer når den returnerer fra MovieListActivity. Her er koden min:

Kode

package com.tobiasfoyen.mio;

import java.util.List;
import java.util.Random;

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;

public class MainActivity extends ListActivity {
	  private CommentsDataSource datasource;
	
	  @Override
	  public void onCreate(Bundle savedInstanceState) {
		  super.onCreate(savedInstanceState);
		    setContentView(R.layout.activity_main);
	
		    datasource = new CommentsDataSource(this);
		    datasource.open();
	
		    List<Comment> values = datasource.getAllComments();
	
		    ArrayAdapter<Comment> adapter = new ArrayAdapter<Comment>(this,
		        android.R.layout.simple_list_item_1, values);
		    setListAdapter(adapter);
	  }
	
	  public void newActivityOnClik(View view) {
		
		Intent intent=new Intent(getApplicationContext(),MovieListActivity.class);
		startActivityForResult(intent, 100);
	      
	  }
	  @Override
	  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		  super.onActivityResult(requestCode, resultCode, data);
		  if (requestCode == 100) {
			  if (resultCode == RESULT_OK) {
				  String myValue = data.getStringExtra("valueName"); 
				  Log.v("blah", myValue);
				 
				  @SuppressWarnings("unchecked")
				  ArrayAdapter<Comment> adapter = (ArrayAdapter<Comment>) getListAdapter();
				  Comment comment = null;
				  
				  String[] comments = new String[] { "Cool", "Very nice", "Hate it" };
		    	  int nextInt = new Random().nextInt(3);
		    	  
		    	  comment = datasource.createComment(comments[nextInt]);
		    	  adapter.add(comment);
		    	  
		    	  adapter.notifyDataSetChanged();
			  }
		  }
	  }
	
	  @Override
	  protected void onResume() {
	    datasource.open();
	    super.onResume();
	  }
	
	  @Override
	  protected void onPause() {
	    datasource.close();
	    super.onPause();
	  }

}
Og her er Error-meldingene som dukker opp:

Kode

05-18 21:28:50.576: D/AndroidRuntime(1926): Shutting down VM
05-18 21:28:50.576: W/dalvikvm(1926): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
05-18 21:28:50.756: E/AndroidRuntime(1926): FATAL EXCEPTION: main
05-18 21:28:50.756: E/AndroidRuntime(1926): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=Intent { (has extras) }} to activity {com.tobiasfoyen.mio/com.tobiasfoyen.mio.MainActivity}: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.tobiasfoyen.mio/databases/commments.db
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at android.app.ActivityThread.deliverResults(ActivityThread.java:3141)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at android.app.ActivityThread.handleSendResult(ActivityThread.java:3184)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at android.app.ActivityThread.access$1100(ActivityThread.java:130)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at android.os.Handler.dispatchMessage(Handler.java:99)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at android.os.Looper.loop(Looper.java:137)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at android.app.ActivityThread.main(ActivityThread.java:4745)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at java.lang.reflect.Method.invokeNative(Native Method)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at java.lang.reflect.Method.invoke(Method.java:511)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at dalvik.system.NativeStart.main(Native Method)
05-18 21:28:50.756: E/AndroidRuntime(1926): Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.tobiasfoyen.mio/databases/commments.db
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1437)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at com.tobiasfoyen.mio.CommentsDataSource.createComment(CommentsDataSource.java:35)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at com.tobiasfoyen.mio.MainActivity.onActivityResult(MainActivity.java:52)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at android.app.Activity.dispatchActivityResult(Activity.java:5192)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	at android.app.ActivityThread.deliverResults(ActivityThread.java:3137)
05-18 21:28:50.756: E/AndroidRuntime(1926): 	... 11 more
Setter pris på all hjelp eller pek i riktig retning
Linux geek!
Sauu's Avatar
Punkt 1; les feilkoden og finn stedet hvor feilen ligger....

Feilen i koden ligger i linje 52 ifølge logcat'en. Dvs linjen med "comment = datasource.createComment(comments[nextInt]);" Deretter i linje 35 i CommentsDataSource. Feilmeldingen sier at du i CommentsDataSource prøver å åpne et SQL-Database-objekt som allerede er lukket. Om du ikke klarer å finne problemet må du poste Klassen CommentsDataSource...

Men første bud er at du må lære hvordan du skal lese de forskjellige feilmeldingene du får. Da kan du finne eksakt hvor koden gir feil, og det blir mye lettere å forstå hva som er problemet.

Lykke til!
Trådstarter
50 5
Sitat av Sauu Vis innlegg
Punkt 1; les feilkoden og finn stedet hvor feilen ligger....

Feilen i koden ligger i linje 52 ifølge logcat'en. Dvs linjen med "comment = datasource.createComment(comments[nextInt]);" Deretter i linje 35 i CommentsDataSource. Feilmeldingen sier at du i CommentsDataSource prøver å åpne et SQL-Database-objekt som allerede er lukket. Om du ikke klarer å finne problemet må du poste Klassen CommentsDataSource...

Men første bud er at du må lære hvordan du skal lese de forskjellige feilmeldingene du får. Da kan du finne eksakt hvor koden gir feil, og det blir mye lettere å forstå hva som er problemet.

Lykke til!
Vis hele sitatet...
Først av alt, takk for en god tilbakemelding Jeg har ikke før nå visst hvordan å se hvilken linje feilen ligger på. Men skjønte allikevel ikke hva som var galt... Her er koden til CommentsDataSource:

Kode

package com.tobiasfoyen.mio;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

public class CommentsDataSource {

	  // Database fields
	  private SQLiteDatabase database;
	  private MySQLiteHelper dbHelper;
	  private String[] allColumns = { MySQLiteHelper.COLUMN_ID,
	      MySQLiteHelper.COLUMN_COMMENT };

	  public CommentsDataSource(Context context) {
	    dbHelper = new MySQLiteHelper(context);
	  }

	  public void open() throws SQLException {
	    database = dbHelper.getWritableDatabase();
	  }

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

	  public Comment createComment(String comment) {
	    ContentValues values = new ContentValues();
	    values.put(MySQLiteHelper.COLUMN_COMMENT, comment);
	    long insertId = database.insert(MySQLiteHelper.TABLE_COMMENTS, null,
	        values);
	    Cursor cursor = database.query(MySQLiteHelper.TABLE_COMMENTS,
	        allColumns, MySQLiteHelper.COLUMN_ID + " = " + insertId, null,
	        null, null, null);
	    cursor.moveToFirst();
	    Comment newComment = cursorToComment(cursor);
	    cursor.close();
	    return newComment;
	  }

	  public void deleteComment(Comment comment) {
	    long id = comment.getId();
	    System.out.println("Comment deleted with id: " + id);
	    database.delete(MySQLiteHelper.TABLE_COMMENTS, MySQLiteHelper.COLUMN_ID
	        + " = " + id, null);
	  }

	  public List<Comment> getAllComments() {
	    List<Comment> comments = new ArrayList<Comment>();

	    Cursor cursor = database.query(MySQLiteHelper.TABLE_COMMENTS,
	        allColumns, null, null, null, null, null);

	    cursor.moveToFirst();
	    while (!cursor.isAfterLast()) {
	      Comment comment = cursorToComment(cursor);
	      comments.add(comment);
	      cursor.moveToNext();
	    }
	    // Make sure to close the cursor
	    cursor.close();
	    return comments;
	  }

	  private Comment cursorToComment(Cursor cursor) {
	    Comment comment = new Comment();
	    comment.setId(cursor.getLong(0));
	    comment.setComment(cursor.getString(1));
	    return comment;
	  }
	}
Og til MySQLiteHelper:

Kode

package com.tobiasfoyen.mio;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class MySQLiteHelper extends SQLiteOpenHelper {

	  public static final String TABLE_COMMENTS = "comments";
	  public static final String COLUMN_ID = "_id";
	  public static final String COLUMN_COMMENT = "comment";

	  private static final String DATABASE_NAME = "commments.db";
	  private static final int DATABASE_VERSION = 1;

	  // Database creation sql statement
	  private static final String DATABASE_CREATE = "create table "
	      + TABLE_COMMENTS + "(" + COLUMN_ID
	      + " integer primary key autoincrement, " + COLUMN_COMMENT
	      + " text not null);";

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

	  @Override
	  public void onCreate(SQLiteDatabase database) {
	    database.execSQL(DATABASE_CREATE);
	  }

	  @Override
	  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	    Log.w(MySQLiteHelper.class.getName(),
	        "Upgrading database from version " + oldVersion + " to "
	            + newVersion + ", which will destroy all old data");
	    db.execSQL("DROP TABLE IF EXISTS " + TABLE_COMMENTS);
	    onCreate(db);
	  }

	}
Linux geek!
Sauu's Avatar
Etter å ha sett inn i koden ser jeg at du lukker databasen din i 'onPause'. Du åpner den igjen i 'onResume', men 'onResume' blir kjørt etter 'onActivityResult' (for mer info se her). Dvs. at du i 'onActivityResult' prøver å bruke ett database-objekt som er lukket, og det resulterer i at appen krasjer.

Du kan prøve å åpne databasen i 'onActivityResult', før du bruker den. Det er veldig viktig å åpne og lukke databasen når appen ikke er i bruk (slik som du gjør).

Her kan du lese litt om hvordan du leser feilmeldinger i java.
Trådstarter
50 5
Sitat av Sauu Vis innlegg
Etter å ha sett inn i koden ser jeg at du lukker databasen din i 'onPause'. Du åpner den igjen i 'onResume', men 'onResume' blir kjørt etter 'onActivityResult' (for mer info se her). Dvs. at du i 'onActivityResult' prøver å bruke ett database-objekt som er lukket, og det resulterer i at appen krasjer.

Du kan prøve å åpne databasen i 'onActivityResult', før du bruker den. Det er veldig viktig å åpne og lukke databasen når appen ikke er i bruk (slik som du gjør).

Her kan du lese litt om hvordan du leser feilmeldinger i java.
Vis hele sitatet...
Man! Hvor nydelig er ikke dette! Takk skal du ha, alle mine problemer er løst. Ihvertfall for nå