2014-01-26 2 views
0

현재 안드로이드에서 생성 된 데이터베이스 테이블을 채우려고합니다. 내 액티비티가이 어댑터의 메소드를 실행할 수 있도록하는 데이터베이스 어댑터를 만들었습니다.안드로이드 SQLite 데이터베이스 채우기

DBAdapter.java

package com.example.universitybudgetub; 

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

public class DBAdapter { 
    public static final String KEY_ROWID = "id"; 
    public static final String KEY_FOOD = "food"; 
    public static final String KEY_CLOTHES = "clothes"; 
    public static final String KEY_SUPERMARKET = "supermarket"; 
    public static final String KEY_TAXI= "taxi"; 
    public static final String KEY_SPORTS = "sports"; 
    public static final String KEY_CLUBS_BARS = "clubs_bars"; 
    public static final String KEY_OWED_MONEY = "owed_money"; 
    public static final String KEY_OTHER = "other"; 
    public static final String KEY_ELECTRIC_GAS = "electric_gas"; 
    public static final String KEY_WATERBILL = "waterbill"; 
    public static final String KEY_RENT = "rent"; 
    public static final String KEY_HOUSE = "house"; 
    public static final String KEY_INTERNETBILL = "internetbill"; 
    private static final String TAG = "DBAdapter"; 

    private static String DATABASE_NAME = "ExpensesDB"; 
    private static final String DATABASE_TABLE = "expenses"; 
    private static final int DATABASE_VERSION = 2; 

    private static final String DATABASE_CREATE = 
      "create table if not exists assignments (id integer primary key autoincrement, " + 
    "food VARCHAR, clothes VARCHAR, supermarket VARCHAR, taxi VARCHAR, sports VARCHAR, clubs_bars VARCHAR, owed_money VARCHAR, other VARCHAR, electric_gas VARCHAR, waterbill VARCHAR, rent VARCHAR, house VARCHAR, internetbill VARCHAR);"; 

private final Context context; 

private DatabaseHelper DBHelper; 
private SQLiteDatabase db; 

public DBAdapter(Context ctx){ 
    this.context = ctx; 
    DBHelper = new DatabaseHelper(context); 
} 

//Instantiate's all the database methods 
public static class DatabaseHelper extends SQLiteOpenHelper { 
    DatabaseHelper(Context context){ 
     super (context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db){ 
     try{ 
      db.execSQL(DATABASE_CREATE); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

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

//Opens database 
public DBAdapter open() throws SQLException{ 
    db = DBHelper.getWritableDatabase(); 
    return this; 
} 

//Close database 
public void close(){ 
    DBHelper.close(); 
} 

//Insert record to database 
public long insertRecord(String food, String clothes, String supermarket, String taxi, String sports, String clubs_bars, 
     String owed_money, String other, String electric_gas, String waterbill, String rent, String house, String internetbill){ 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_FOOD, food); 
    initialValues.put(KEY_CLOTHES, clothes); 
    initialValues.put(KEY_SUPERMARKET, supermarket); 
    initialValues.put(KEY_TAXI, taxi); 
    initialValues.put(KEY_SPORTS, sports); 
    initialValues.put(KEY_CLUBS_BARS, clubs_bars); 
    initialValues.put(KEY_OWED_MONEY, owed_money); 
    initialValues.put(KEY_OTHER, other); 
    initialValues.put(KEY_ELECTRIC_GAS, electric_gas); 
    initialValues.put(KEY_WATERBILL, waterbill); 
    initialValues.put(KEY_RENT, rent); 
    initialValues.put(KEY_HOUSE, house); 
    initialValues.put(KEY_INTERNETBILL, internetbill); 
    return db.insert(DATABASE_TABLE, null, initialValues); 
} 

//Delete particular record 
public boolean deleterRecord(long rowId) 
{ 
    return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; 
} 

//Retrieve particular record 
public Cursor getRecord(long rowId) throws SQLException 
{ 
    Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_FOOD, KEY_CLOTHES, KEY_TAXI, KEY_SPORTS, 
      KEY_CLUBS_BARS, KEY_OWED_MONEY, KEY_OTHER, KEY_ELECTRIC_GAS, KEY_WATERBILL, KEY_RENT, KEY_HOUSE, KEY_INTERNETBILL}, 
      KEY_ROWID + "=" + rowId, null, null, null, null, null); 
    if (mCursor != null) { 
      mCursor.moveToFirst(); 
    } 
    return mCursor; 
} 

//Update particular record 
public boolean updateRecord(long rowId, int food, int clothes, int taxi, int sports, int clubs_bars, int owed_money, int other, 
     int electric_gas, int waterbill, int rent, int house, int internetbill){ 
    ContentValues args = new ContentValues(); 
    args.put(KEY_FOOD, food); 
    args.put(KEY_CLOTHES, clothes); 
    args.put(KEY_TAXI, taxi); 
    args.put(KEY_SPORTS, sports); 
    args.put(KEY_CLUBS_BARS, clubs_bars); 
    args.put(KEY_OWED_MONEY, owed_money); 
    args.put(KEY_OTHER, other); 
    args.put(KEY_ELECTRIC_GAS, electric_gas); 
    args.put(KEY_WATERBILL, waterbill); 
    args.put(KEY_RENT, rent); 
    args.put(KEY_HOUSE, house); 
    args.put(KEY_INTERNETBILL, internetbill); 
    return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; 
} 


} 

MainMenu.java

package com.example.universitybudgetub; 

import java.io.File; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.Toast; 


public class MainMenu extends FragmentActivity { 

    DBAdapter db = new DBAdapter(this); 
    SectionsPagerAdapter mSectionsPagerAdapter; 
    ViewPager mViewPager; 

    //OnCreate 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_menu); 
     mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 
     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 
    } 

    public void onClick(View v){ 
      String destPath = "/data/data/" + getPackageName() + "/databases/ExpensesDB"; 
      @SuppressWarnings("unused") 
      File f = new File(destPath); 
    } 

    //Add New Record 
    public void addRecord (View v){ 
     Log.d("test", "adding"); 
     //Get data from form 
     EditText foodTxt = (EditText)findViewById(R.id.editText_food); 
     EditText taxiTxt = (EditText)findViewById(R.id.editText_taxi); 
     EditText clothesTxt = (EditText)findViewById(R.id.editText_clothes); 
     EditText sportsTxt = (EditText)findViewById(R.id.editText_sports); 
     EditText supermarketTxt = (EditText)findViewById(R.id.editText_supermarket); 
     EditText clubs_barsTxt = (EditText)findViewById(R.id.editText_clubs); 
     EditText owed_moneyTxt = (EditText)findViewById(R.id.editText_owed_money); 
     EditText otherTxt = (EditText)findViewById(R.id.editText_other); 
     EditText electric_gasTxt = (EditText)findViewById(R.id.editText_electric_gas); 
     EditText waterbillTxt = (EditText)findViewById(R.id.editText_water); 
     EditText houseTxt = (EditText)findViewById(R.id.editText_house); 
     EditText rentTxt = (EditText)findViewById(R.id.editText_rent); 
     EditText internetTxt = (EditText)findViewById(R.id.editText_internet); 

     db.open(); 
     @SuppressWarnings("unused") 
     long id = db.insertRecord(foodTxt.getText().toString(), clothesTxt.getText().toString(), 
       supermarketTxt.getText().toString(), taxiTxt.getText().toString(), sportsTxt.getText().toString(), 
       clubs_barsTxt.getText().toString(), owed_moneyTxt.getText().toString(), otherTxt.getText().toString(), 
       electric_gasTxt.getText().toString(), waterbillTxt.getText().toString(), rentTxt.getText().toString(), 
       houseTxt.getText().toString(), internetTxt.getText().toString()); 
     db.close(); 
     Log.d("test", "added"); 

     //Set editText fields to empty 
     foodTxt.setText(""); 
     taxiTxt.setText(""); 
     clothesTxt.setText(""); 
     sportsTxt.setText(""); 
     supermarketTxt.setText(""); 
     clubs_barsTxt.setText(""); 
     owed_moneyTxt.setText(""); 
     otherTxt.setText(""); 
     electric_gasTxt.setText(""); 
     waterbillTxt.setText(""); 
     houseTxt.setText(""); 
     rentTxt.setText(""); 
     internetTxt.setText(""); 
     Toast.makeText(MainMenu.this, "Expenses Added", Toast.LENGTH_LONG).show(); 
    } 

    //OnCreateOptionsMenu 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main_menu, menu); 
     return true; 
    } 

    //SectionsPagerAdapter Controls which Fragment is retrieved for each page 
    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      Fragment fragment; 
      switch (position) { 
       case 0: 
        fragment = new Fragment1(); 
        break; 
       case 1: 
        fragment = new Fragment2(); 
        break; 
       case 2: 
        fragment = new Fragment3(); 
        break; 
       case 3: 
        fragment = new Fragment4(); 
        break; 
       case 4: 
        fragment = new Fragment5(); 
        break; 
       default: 
        fragment = null; 
        break; 
      } 
      return fragment; 
     } 

     //Returns the amount of pages to display 
     @Override 
     public int getCount() { 
      // Show 3 total pages. 
      return 5; 
     } 

     //Page Title 
     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
      case 0: 
       return getString(R.string.title_section1); 
      case 1: 
       return getString(R.string.title_section2); 
      case 2: 
       return getString(R.string.title_section3); 
      case 3: 
       return getString(R.string.title_section4); 
      case 4: 
       return getString(R.string.title_section5); 
      } 
      return null; 
     } 
    } 
} 

그것이 내가 동적로부터 입력되는 정보를 저장하려고 할 때마다 던지는 유지한다는 오류 메시지 editText 필드 :

01-26 17:41:27.814: E/SQLiteLog(3973): (1) no such table: expenses 
01-26 17:41:27.854: E/SQLiteDatabase(3973): Error inserting clubs_bars=1 supermarket=1 other=1 taxi=1 clothes=1 food=1 waterbill=1 electric_gas=1 sports=1 rent=1 internetbill=1 house=1 owed_money=1 
01-26 17:41:27.854: E/SQLiteDatabase(3973): android.database.sqlite.SQLiteException: no such table: expenses (code 1): , while compiling: INSERT INTO expenses(clubs_bars,supermarket,other,taxi,clothes,food,waterbill,electric_gas,sports,rent,internetbill,house,owed_money) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at com.example.universitybudgetub.DBAdapter.insertRecord(DBAdapter.java:97) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at com.example.universitybudgetub.MainMenu.addRecord(MainMenu.java:60) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at java.lang.reflect.Method.invoke(Method.java:525) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at android.view.View$1.onClick(View.java:3628) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at android.view.View.performClick(View.java:4240) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at android.view.View$PerformClick.run(View.java:17721) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at android.os.Handler.handleCallback(Handler.java:730) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at android.os.Handler.dispatchMessage(Handler.java:92) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at android.os.Looper.loop(Looper.java:137) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at java.lang.reflect.Method.invoke(Method.java:525) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
01-26 17:41:27.854: E/SQLiteDatabase(3973):  at dalvik.system.NativeStart.main(Native Method) 
01-26 17:41:27.854: D/test(3973): added 
01-26 17:41:28.264: I/Choreographer(3973): Skipped 100 frames! The application may be doing too much work on its main thread. 

나는이 예외를 던지고있는 주된 이유는 명백하게 '그러한 테이블이 없다 : 비용'이지만 분명히 잘못된 것인가? onCreate 시나리오에서 비용 테이블을 만들었고 'DDMS'를 확인하고 data/data/packagename/databases/ExpensesDB를 검색하면 데이터베이스 파일이 생성 된 것을 알 수 있습니다.

기괴한보고 내 소스 코드에 어떤 문제도 찾을 수 없다. 어떤 도움이라도 좋을 것입니다!

+0

앱을 제거하거나 설정으로 이동하여 앱의 '데이터 지우기'버튼을 클릭 한 다음 다시 실행 해보세요. 내 생각 엔'CREATE TABLE' 문을 추가하기 전의 기존 데이터베이스가 있다는 것입니다. – CommonsWare

+1

"expenses"테이블을 만드는 위치를 볼 수 없습니다. "assignments"테이블을 만들었지 만 'expenses'테이블을 추가하는 위치를 볼 수 있습니까? DDMS를 사용하여 만든 데이터베이스 파일을 바탕 화면에 복사 할 수도 있고 – Larry

+0

@CommonsWare는 코드를 편집 한 후 데이터를 지우고 새로운 응용 프로그램으로 시작하여 매력 감사처럼 작동했습니다. – user3197786

답변

0

'비용'테이블이 아닌 할당이라는 테이블을 생성하고 있습니다. DATABASE_CREATE 문을 수정하십시오.

+0

그래, 네가 옳았 어, 바보 같이 내 SQL 문에 '과제'가 추가 되었어. 이걸 발견해 주니 덕분에 시간이 많이 걸렸을거야. – user3197786

0

DDMS보기에서 데이터베이스 파일 (오른쪽 상단 모서리 근처에 있음)을 저장하고 SQLite보기 프로그램에서 열 수 있습니다. 이것은 당신이 특정 테이블을 확인하실 수 있습니다 - http://sourceforge.net/projects/sqlitebrowser/ 나는 당신이 데이터베이스를 확인했지만 귀하의 게시물에서 가져 갔지만 아직 테이블을 들여다 보지 않았습니까?

귀하의 휴대폰이 루팅 된 것이 아닌 한, 에뮬레이터에서 실행되는 데이터베이스로이 작업을 수행했다고 생각합니다.

그런 다음 데이터베이스에 올바른 테이블과 필드가 모두 있는지 확인할 수 있습니다. 또한 코드에서 실행하기 전에 SQL 테이블 생성/삽입 코드를 실행하고 문제를 추측 할 필요가 없습니다.

유일한 문제는 SQL이 유효하지 않은 경우 가끔 중단된다는 것입니다. Navicat와 같은 장점은 없지만 SQL이 맞으면 제대로 작동합니다.

+0

내 테이블이 있는지 확인하기 위해 db를 확인하는 뛰어난 소프트웨어 감사합니다! – user3197786

관련 문제