2014-04-21 8 views
0

J'écris un journal app android, mais l'application a arrêtéapplication journal android - image dans la base de données SQLite

J'ai succès mis le texte dans la base de données (SQLite) Et je veux mettre des photos de la galerie du téléphone mobile dans la base de données trop après avoir ajouté le code de photos, l'application a arrêté Je ne sais pas comment résoudre ce

S'il vous plaît aidez-moi à voir ce qui se trompe sur le code

public class EditActivity extends Activity { 
private EditText editText; 
private Button phoBtn; 
private Button saveBtn; 
private Button cancalBtn; 
private DBHelper dbHelper; 
private int id; 

SQLiteDatabase db; 
private String selectedImagePath; 
private static final int SELECT_PICTURE = 1; 

ImageView iv; 
Uri selectedImageUri; 
String ivimage; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_edit); 
    editText = (EditText) findViewById(R.id.editText); 
    phoBtn = (Button) findViewById(R.id.photos); 
    saveBtn = (Button) findViewById(R.id.save); 
    cancalBtn = (Button) findViewById(R.id.cancel); 
    id = getIntent().getIntExtra("_id", -1); 


    iv=(ImageView)findViewById(R.id.imageView1); 

    System.out.println(id); 
    dbHelper = new DBHelper(this); 

    if (id != -1) { 
     Cursor cursor = dbHelper.query(
       "select name,content,dt from DIARY where _id=?", 
       new String[] { String.valueOf(id) }); 
     cursor.moveToFirst(); 
     String content = cursor.getString(1); 
     editText.setText(content); 
     String i=cursor.getString(cursor.getColumnIndex("image")); 
     Uri imgUri=Uri.parse(i); 
     iv.setImageURI(imgUri); 

     saveBtn.setOnClickListener(updateClickListener); 
    }else 
    { 
     db.execSQL("insert into DIARY values('"+selectedImageUri+"')"); 

     saveBtn.setOnClickListener(saveClickListener); 
    } 

    cancalBtn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(EditActivity.this,MainActivity.class); 
      startActivity(intent); 
     } 
    }); 

    phoBtn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(); 
      intent.setType("image/*"); 
      intent.setAction(Intent.ACTION_GET_CONTENT); 
      startActivityForResult(
        Intent.createChooser(intent, "Select Picture"), 
        SELECT_PICTURE); 
     } 
    }); 
} 

View.OnClickListener updateClickListener = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     String text = editText.getText().toString(); 
     ContentValues values = new ContentValues(); 
     values.put("content", text); 

     String ivimage=iv.getContext().toString(); 
     values.put("image", ivimage); 


     dbHelper.update(values,String.valueOf(id)); 
     Intent intent = new Intent(EditActivity.this,MainActivity.class); 
     startActivity(intent); 
    } 
}; 

EditText et =null; 
String text; 
View.OnClickListener saveClickListener = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     et = new EditText(EditActivity.this); 
     text = editText.getText().toString(); 
     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     String date = format.format(new Date()); 
     et.setText(date); 
     new AlertDialog.Builder(EditActivity.this) 
     .setTitle("My Diary") 
     .setIcon(android.R.drawable.ic_dialog_info) 
     .setView(et) 
     .setPositiveButton("Save", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       String name = et.getText().toString(); 
       ContentValues values = new ContentValues() ; 
       values.put("name", name); 
       values.put("content", text); 
       values.put("image", ivimage); 
       dbHelper.insert(values); 
       Intent intent = new Intent(EditActivity.this,MainActivity.class); 
       startActivity(intent); 
      } 
     }) 
     .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }) 
     .show(); 
    } 
}; 

public String getPath(Uri uri) { 
     String[] projection = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = managedQuery(uri, projection, null, null, null); 
     int column_index = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == RESULT_OK) { 
      if (requestCode == SELECT_PICTURE) { 
       selectedImageUri = data.getData(); 

       selectedImagePath = getPath(selectedImageUri); 
       System.out.println("Image Path : " + selectedImagePath); 
       iv.setVisibility(View.VISIBLE); 
       iv.setImageURI(selectedImageUri); 
      } 
     } 
    } 

}

+0

Première étape: Exception stacktrace dans logcat. Incluez-le dans la question, aussi. – laalto

+0

est-ce nécessaire? – user1735815

+0

si l'exception stacktrace dans logcat est nécessaire, comment le faire – user1735815

Répondre

0

java.lang.IllegalStateException: Impossible de lire la ligne 0, col -1 à partir de CursorWindow. Assurez-vous que le curseur est initialisé correctement avant d'y accéder.

Cette exception vient d'ici:

Cursor cursor = dbHelper.query(
     "select name,content,dt from DIARY where _id=?", 
     new String[] { String.valueOf(id) }); 
cursor.moveToFirst(); 
String content = cursor.getString(1); 
editText.setText(content); 
String i=cursor.getString(cursor.getColumnIndex("image")); 

Votre curseur ne contient pas la colonne image et getColumnIndex() retours -1.

Pour corriger cela, ajoutez image à la projection:

select name,content,dt,image from ... 

En outre, vous devriez vérifier la valeur de retour de moveToFirst() pour vous assurer que le curseur pointe sur une ligne valide avant d'essayer de lire les valeurs de la colonne.

+0

si ma base de données comme celui-ci onCreate public void (SQLiteDatabase db) { \t \t Chaîne sql = "CREATE TABLE" \t \t \t \t + Table \t \t \t \t + "(_id ENTIER not null AUTOINCREMENT PRIMARY KEY, NOM VARCHAR (50), TEXTE DU CONTENU, IMAGE VARCHAR, DT TIMESTAMP par défaut (datetime ('now', 'localtime'))); \t \t db.execSQL (sql); \t} avez une autre méthode? – user1735815

+0

Merci beaucoup! Résolu !!! – user1735815

+0

J'ai changé le code ci-dessous, cela fonctionne – user1735815

Questions connexes