2014-01-26 6 views
0

В настоящее время я пытаюсь заполнить таблицу базы данных, созданную в android. Я создал адаптер базы данных, который позволяет моим действиям запускать методы из этого адаптера.Заполнение базы данных Android 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» и просматриваю данные/данные/packagename/databases/ExpensesDB, я нахожу созданный файл базы данных.

Bizarre look and не может найти проблемы с моим исходным кодом. Любая помощь будет замечательной!

+0

Удалите приложение или зайдите в «Настройки» и нажмите кнопку «Очистить данные» для своего приложения, а затем попробуйте запустить его снова. Я предполагаю, что у вас есть существующая база данных, прежде чем добавить инструкцию 'CREATE TABLE'. – CommonsWare

+1

Я не вижу, где вы создаете таблицу «затраты». Я вижу, что вы создаете таблицу «присваивания», но где добавить таблицу «затраты»? Вы также можете скопировать файл базы данных, созданный с помощью DDMS, на свой рабочий стол и посмотрите на базу данных, используя такую ​​утилиту, как аддон sqlite для Firefox. – 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

Смежные вопросы