2014-01-15 1 views
0

DB가있는 바코드 스캐너를 만들려고합니다. 데이터베이스가 있으면 데이터를 추가하고 테이블 이름이 "quantityCalculator"인 "quantityCalculator.db"라는 이름의 새 DB를 만듭니다.기존 SQLite db를 참조하는 방법 else 다른 DB를 만들고 데이터를 삽입 하시겠습니까?

유무는 일부 기존 코드를 가지고 있지만/

오류 해결하기위한 시도로 많은 오류를 던지고있다 :

01-15 15:44:26.600: E/Trace(24862): error opening trace file: No such file or directory (2) 
01-15 15:44:27.350: I/Adreno200-EGL(24862): <qeglDrvAPI_eglInitialize:299>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_JB_REL_RB1.04.01.01.06.043_msm7627a_JB_REL_RB1.2_Merge_release_AU (Merge) 
01-15 15:44:27.350: I/Adreno200-EGL(24862): Build Date: 01/18/13 Fri 
01-15 15:44:27.350: I/Adreno200-EGL(24862): Local Branch: 
01-15 15:44:27.350: I/Adreno200-EGL(24862): Remote Branch: m/jb_rel_rb1.2 
01-15 15:44:27.350: I/Adreno200-EGL(24862): Local Patches: NONE 
01-15 15:44:27.350: I/Adreno200-EGL(24862): Reconstruct Branch: NOTHING 
01-15 15:44:31.910: E/SQLiteLog(24862): (14) cannot open file at line 30178 of [00bb9c9ce4] 
01-15 15:44:31.910: E/SQLiteLog(24862): (14) os_unix.c:30178: (2) open(//foodcalculator.db) - 
01-15 15:44:31.920: E/SQLiteDatabase(24862): Failed to open database 'foodcalculator.db'. 
01-15 15:44:31.920: E/SQLiteDatabase(24862): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:213) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:197) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:485) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at com.example.quantitycalculator.AddItem.checkDataBase(AddItem.java:50) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at com.example.quantitycalculator.AddItem.onClick(AddItem.java:82) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.view.View.performClick(View.java:4106) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.view.View$PerformClick.run(View.java:17150) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.os.Handler.handleCallback(Handler.java:615) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.os.Looper.loop(Looper.java:137) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at android.app.ActivityThread.main(ActivityThread.java:4792) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at java.lang.reflect.Method.invokeNative(Native Method) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at java.lang.reflect.Method.invoke(Method.java:511) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:808) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:575) 
01-15 15:44:31.920: E/SQLiteDatabase(24862): at dalvik.system.NativeStart.main(Native Method) 
01-15 15:44:31.920: W/dalvikvm(24862): threadid=1: thread exiting with uncaught exception (group=0x40c83498) 
01-15 15:44:31.920: E/test(24862): Exception 
01-15 15:44:31.940: E/AndroidRuntime(24862): FATAL EXCEPTION: main 
01-15 15:44:31.940: E/AndroidRuntime(24862): java.lang.NullPointerException 
01-15 15:44:31.940: E/AndroidRuntime(24862): at com.example.quantitycalculator.AddItem.checkDataBase(AddItem.java:55) 
01-15 15:44:31.940: E/AndroidRuntime(24862): at com.example.quantitycalculator.AddItem.onClick(AddItem.java:82) 
01-15 15:44:31.940: E/AndroidRuntime(24862): at android.view.View.performClick(View.java:4106) 
01-15 15:44:31.940: E/AndroidRuntime(24862): at android.view.View$PerformClick.run(View.java:17150) 
01-15 15:44:31.940: E/AndroidRuntime(24862): at android.os.Handler.handleCallback(Handler.java:615) 
01-15 15:44:31.940: E/AndroidRuntime(24862): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-15 15:44:31.940: E/AndroidRuntime(24862): at android.os.Looper.loop(Looper.java:137) 
01-15 15:44:31.940: E/AndroidRuntime(24862): at android.app.ActivityThread.main(ActivityThread.java:4792) 
01-15 15:44:31.940: E/AndroidRuntime(24862): at java.lang.reflect.Method.invokeNative(Native Method) 
01-15 15:44:31.940: E/AndroidRuntime(24862): at java.lang.reflect.Method.invoke(Method.java:511) 
01-15 15:44:31.940: E/AndroidRuntime(24862): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:808) 
01-15 15:44:31.940: E/AndroidRuntime(24862): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:575) 
01-15 15:44:31.940: E/AndroidRuntime(24862): at dalvik.system.NativeStart.main(Native Method) 

홈페이지 :

package com.example.quantitycalculator; 

import com.example.quantitycalculator.R; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class Homepage extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.homepage); 

     final Button addButton = (Button) findViewById(R.id.scanner); 
     final Button editInventoryButton = (Button) findViewById(R.id.editItem); 
     final Button currentInventoryButton = (Button) findViewById(R.id.currentItems); 
     final Button settingsButton = (Button) findViewById(R.id.settings); 

     addButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(view.getContext(), AddItem.class); 
       startActivity(intent); 
      } 
     }); 

     currentInventoryButton.setOnClickListener(new View.OnClickListener(){ 

      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(view.getContext(), CurrentItems.class); 
       startActivity(intent); 
      } 
     }); 


     editInventoryButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       // TODO Auto-generated method stub 
       Intent intent = new Intent(view.getContext(), EditItems.class); 
       startActivity(intent); 
      } 
     }); 

     settingsButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       // TODO Auto-generated method stub 
       Intent intent = new Intent(view.getContext(), Settings.class); 
       startActivity(intent); 
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.main, menu); 
     return super.onCreateOptionsMenu(menu); 

    } 

    static final class ProductData { 
     String barcode; 
     String title; 
     Double quantity; 
    } 
} 

AddItem을 :

package com.example.quantitycalculator; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import com.example.quantitycalculator.R; 

import com.example.quantitycalculator.Homepage.ProductData; 

public class AddItem extends Activity implements OnClickListener { 
    private static final int REQUEST_BARCODE = 0; 
    private static final ProductData mProductData = new ProductData(); 
    EditText mBarcodeEdit; 
    EditText mTitleEdit; 
    EditText mQuantityEdit; 
    private Button mScanButton; 
    private Button mAddButton; 

    final String DATABASE_NAME = "quantitycalculator.db"; 
    final String DATABASE_PATH = "/data/data/com.quantitycalculator.db"; 
    private final String PRODUCT_TABLE = "foodItems"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.add_product); 

     mBarcodeEdit = (EditText) findViewById(R.id.barcodeEdit); 
     mTitleEdit = (EditText) findViewById(R.id.titleEdit); 
     mQuantityEdit = (EditText) findViewById(R.id.quantityEdit); 
     mScanButton = (Button) findViewById(R.id.scanButton); 
     mScanButton.setOnClickListener(this); 
     mAddButton = (Button) findViewById(R.id.addButton); 
     mAddButton.setOnClickListener(this); 
    } 

    private boolean checkDataBase() { 
     SQLiteDatabase checkDB = null; 
     try { 
      checkDB = SQLiteDatabase.openDatabase(DATABASE_NAME, null, 
        SQLiteDatabase.OPEN_READONLY); 
      checkDB.close(); 
     } catch (SQLiteException e) { 
      // database doesn't exist yet. 
      checkDB.execSQL("CREATE TABLE IF NOT EXISTS " + PRODUCT_TABLE 
        + " (barcode String, title String, quantity Double);"); 
     } 
     return checkDB != null ? true : false; 
    } 

    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     switch (v.getId()) { 
     case R.id.scanButton: 
      Intent intent = new Intent("com.google.zxing.client.android.SCAN"); 
      intent.putExtra("SCAN_MODE", "PRODUCT_MODE"); 
      startActivityForResult(intent, REQUEST_BARCODE); 
      break; 

     case R.id.addButton: 
      String barcode = mBarcodeEdit.getText().toString(); 
      String title = mTitleEdit.getText().toString(); 
      String quantity = mQuantityEdit.getText().toString(); 

      SQLiteDatabase checkDB = null; 

      String errors = validateFields(barcode, title, quantity); 
      if (errors.length() > 0) { 
       showInfoDialog(this, "Please fix errors", errors); 
      } 

      if (checkDataBase() == false) { 
       checkDB = SQLiteDatabase.openDatabase(DATABASE_NAME, null, 
         SQLiteDatabase.OPEN_READWRITE); 

       mProductData.barcode = barcode; 
       mProductData.title = title; 
       mProductData.quantity = Double.valueOf(quantity); 

       checkDB.execSQL("INSERT INTO " + PRODUCT_TABLE + " Values " 
         + (mProductData)); 
       checkDB.close(); 

       showInfoDialog(this, "Success", "Product saved successfully"); 
       resetForm(); 

      } 

      else { 
       checkDB = SQLiteDatabase.openDatabase(DATABASE_NAME, null, 
         SQLiteDatabase.OPEN_READWRITE); 
       mProductData.barcode = barcode; 
       mProductData.title = title; 
       mProductData.quantity = Double.valueOf(quantity); 

       checkDB.execSQL("INSERT INTO " + PRODUCT_TABLE + " Values " 
         + (mProductData)); 
       checkDB.close(); 

       showInfoDialog(this, "Success", "Product saved successfully"); 
       resetForm(); 
      } 
     } 
    } 

    private void showInfoDialog(Context context, String title, 
      String information) { 
     new AlertDialog.Builder(context).setMessage(information) 
       .setTitle(title) 
       .setPositiveButton("OK", new DialogInterface.OnClickListener() { 

        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 

        } 
       }).show(); 
    } 

    private void resetForm() { 
     // TODO Auto-generated method stub 
     mBarcodeEdit.getText().clear(); 
     mTitleEdit.getText().clear(); 
     mQuantityEdit.getText().clear(); 
    } 

    public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     if (requestCode == REQUEST_BARCODE) { 
      if (resultCode == RESULT_OK) { 
       String barcode = intent.getStringExtra("SCAN_RESULT"); 
       mBarcodeEdit.setText(barcode); 

      } else if (resultCode == RESULT_CANCELED) { 
       finish(); 
      } 
     } 
    } 

    private static String validateFields(String barcode, String title, 
      String quantity) { 
     StringBuilder errors = new StringBuilder(); 

     if (barcode.matches("^\\s*$")) { 
      errors.append("Barcode required\n"); 
     } 

     if (title.matches("^\\s*$")) { 
      errors.append("Title required\n"); 
     } 

     if (!quantity.matches("^-?\\d+(.\\d+)?$")) { 
      errors.append("Need numeric quantity\n"); 
     } 

     return errors.toString(); 
    } 
} 

제품 데이터베이스 :

package com.example.quantitycalculator; 

import com.example.quantitycalculator.Homepage.ProductData; 

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

public class ProductDatabase { 
    private static final String PRODUCT_TABLE = "foodItems"; 
    private static final String DATABASE_NAME = "quantitycalculator.db"; 
    private static final int DATABASE_VERSION = 1; 

    private SQLiteDatabase db; 

    private static class ProductDatabaseHelper extends SQLiteOpenHelper { 

     private static final String TAG = null; 

     public ProductDatabaseHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
      // TODO Auto-generated constructor stub 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      StringBuilder sql = new StringBuilder(); 

      sql.append("create table ").append(PRODUCT_TABLE).append("( ") 
        .append(" _id integer primary key,") 
        .append(" barcode text,").append(" title text,") 
        .append(" quantity number").append(") "); 

      db.execSQL(sql.toString()); 

      Log.d(TAG, PRODUCT_TABLE + "table created"); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      db.execSQL("drop table if exists " + PRODUCT_TABLE); 
      onCreate(db); 
     } 
    } 

    public ProductDatabase(Context context) { 
     ProductDatabaseHelper helper = new ProductDatabaseHelper(context); 
     db = helper.getWritableDatabase(); 
    } 

    public boolean insert(ProductData product) { 
     ContentValues vals = new ContentValues(); 
     vals.put("barcode", product.barcode); 
     vals.put("title", product.title); 
     vals.put("quantity", product.quantity); 

     return db.insert(PRODUCT_TABLE, null, vals) != -1; 
    } 
} 

모든 도움이 크게 감사합니다!

답변

0

데이터베이스 폴더는 DATABASE_PATH 우선은 하드 코드 데이터베이스 경로가 DATABASE_PATH 변경 안에 없습니다 이 라인 :

DB_PATH="/data/data/" + context.getPackageName() + "/" + "databases/"; 

귀하의 로그 캣은 Failed to open database 'foodcalculator.db'.를 표시하지만 코드에서 나는 당신이 quantitycalculator.db을 작성 볼 수 있습니다. 올바른 logcat을 게시하십시오.

0

이 활동 데이터베이스 기능을 혼합하는 것은 좋은 생각이 아니다. 데이터베이스와 comunicate하기 위해 새로운 클래스를 생성해야합니다. 당신은이 튜토리얼을 읽어야합니다, 당신이 이해하는 데 도움이 될 것입니다 방법을 설계하고 만들 APP < - 응용 프로그램에서> DB 인터페이스 : https://developer.android.com/training/basics/data-storage/databases.html

관련 문제