2015-10-27 61 views
0

我需要訪問從我的其他活動在一個類中創建的SQLite數據庫。 我想從public void getImage(View view) {訪問,但應用程序崩潰時,我使用它。 這裏是我的活動:如何從另一個類訪問SQLite數據庫

public class CameraToDatabase extends Activity { 
    private static final int CAMERA_REQUEST = 1888; 
    public ImageView imageView1; 
    Imagehelper help = new Imagehelper(this); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_camera_to_database); 


     Button B = (Button) this.findViewById(R.id.camera); 
     B.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       Intent cameraIntent = new Intent(
         android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
       startActivityForResult(cameraIntent, CAMERA_REQUEST); 
      } 
     }); 
    } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == CAMERA_REQUEST) { 
      Bitmap photo = (Bitmap) data.getExtras().get("data"); 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      photo.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
      byte[] byteArray = stream.toByteArray(); 
      help.insert(byteArray); 
     } 
    } 

    public void getImage(View view) { 

     Cursor c = help.getAll(); 
     if (c.moveToNext()) 
     { 
      byte[] byteArray = c.getBlob(0); 
      Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); 
      imageView1.setImageBitmap(bmp); 

     } 
     c.close(); 

    } 

這裏是我創建數據庫:

public class Imagehelper extends SQLiteOpenHelper { 
    private static final String DATABASE_NAME = "clothes.db"; 
    private static final int SCHEMA_VERSION = 3; 

    public Imagehelper(Context context) { 
     super(context, DATABASE_NAME, null, SCHEMA_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL("CREATE TABLE Image(_id INTEGER PRIMARY KEY AUTOINCREMENT,imageblob BLOB);"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    } 

    public void insert(byte[] bytes) { 
     ContentValues cv = new ContentValues(); 

     cv.put("imageblob", bytes); 
     Log.e("inserted", "inserted"); 
     getWritableDatabase().insert("Image", "imageblob", cv); 

    } 

    public Cursor getAll() { 
     return (getReadableDatabase().rawQuery("SELECT column1 FROM Image", null)); 
    } 



} 

} 
+1

移動'help = new Imagehelper(this);'in'onCreate'方法 –

回答

0

現在你Mainactivity ShouldLike即:

package com.solution.sa.stack_camerasql; 

import android.content.Intent; 
import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 

import java.io.ByteArrayOutputStream; 

public class MainActivity extends AppCompatActivity { 

    private static final int CAMERA_REQUEST = 1888; 
    public ImageView imageView1; 
    Imagehelper help ; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     help = new Imagehelper(this); 
     imageView1= (ImageView) this.findViewById(R.id.myimg); 
     Button B = (Button) this.findViewById(R.id.camera); 
     B.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       Intent cameraIntent = new Intent(
         android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
       startActivityForResult(cameraIntent, CAMERA_REQUEST); 
      } 
     }); 
    } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == CAMERA_REQUEST) { 
      Bitmap photo = (Bitmap) data.getExtras().get("data"); 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      photo.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
      byte[] byteArray = stream.toByteArray(); 
      help.insert(byteArray); 
      getImage(); 
     } 
    } 

    public void getImage() { 

     Cursor c = help.getAll(); 
     if (c.moveToNext()) 
     { 
      byte[] byteArray = c.getBlob(0); 
      Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); 
      imageView1.setImageBitmap(bmp); 


     } 
     c.close(); 

    } 
} 

和你Imgaehelper類這樣的:

package com.solution.sa.stack_camerasql; 

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

/** 
* Created by asim on 10/27/2015. 
*/ 
public class Imagehelper extends SQLiteOpenHelper { 
    private static final String DATABASE_NAME = "clothes.db"; 
    private static final int SCHEMA_VERSION = 3; 

    public Imagehelper(Context context) { 
     super(context, DATABASE_NAME, null, SCHEMA_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL("CREATE TABLE Image(_id INTEGER PRIMARY KEY AUTOINCREMENT,imageblob BLOB);"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    } 

    public void insert(byte[] bytes) { 
     ContentValues cv = new ContentValues(); 

     cv.put("imageblob", bytes); 
     Log.e("inserted", "inserted"); 
     getWritableDatabase().insert("Image", "imageblob", cv); 

    } 

    public Cursor getAll() { 
     return (getReadableDatabase().rawQuery("SELECT imageblob FROM Image", null)); 
    } 



} 

現在你只能管理僅顯示上次拍攝的圖像而不是所有圖像上的循環

0

你的表「圖像」沒有列「列1」。它有'_id'和'imageblob',你可以在onCreate方法中看到。所以'getAll'方法永遠不能工作,因爲它執行'SELECT column1 FROM Image'!

看到您正在討論的崩潰的錯誤消息/堆棧跟蹤會很有幫助。

+0

我將culumn1更改爲_id,但當我單擊調用getAll的按鈕時仍然出現此錯誤:java.lang.IllegalStateException:無法執行活動 –

+0

您還沒有初始化'imageView1'。在你的onCreate方法中也是這樣做的!例如: 'imageView1 = new ImageView();' – Phil

0

廣場

new Imagehelper(this) 

的OnCreate之後。

你上創建應該是這樣的:

private static final int CAMERA_REQUEST = 1888; 
    public ImageView imageView1; 
    Imagehelper help ; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_camera_to_database); 
     help = new Imagehelper(this); 

     Button B = (Button) this.findViewById(R.id.camera); 
     B.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       Intent cameraIntent = new Intent(
         android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
       startActivityForResult(cameraIntent, CAMERA_REQUEST); 
      } 
     }); 
    } 
+0

我做到了,但仍然出現此錯誤:java.lang.IllegalStateException:無法執行活動的方法 –

+0

您沒有在所有代碼中調用getImage方法,而且您沒有initiliaze ImageView後創建 –

+0

你的代碼工作absolutelt罰款!只需要按照以下步驟操作:1)創建後初始化圖像視圖。像 imageView1 =(ImageView)this.findViewById(R.id.myimg); –