Populating an Android SQLite Database

妖精的绣舞 提交于 2019-12-25 02:08:41

问题


Currently i'm trying to populate a database table created in android. I have created a database adapter which allows my activities to run the methods from this adapter.

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;
        }
    }
}

The error message that it keeps throwing whenever I try to save the information dynamically inputted from a editText field is:

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.

I can see the main reason thats it's throwing this exception is that apparently 'no such table: expenses' but clearly this is wrong? As I've created an expenses table in an onCreate scenario, and when I check the 'DDMS' and going through data/data/packagename/databases/ExpensesDB - I find the database file having created..

Bizarre looking and cannot find any problem with my source code. Any help would be great!


回答1:


You are creating the table called assignments but not the table 'expenses'. Amend your DATABASE_CREATE statement.




回答2:


In the DDMS view, you can save the database file (button near top right corner), and open it in an SQLite viewing program. This will allow you to check specific tables - http://sourceforge.net/projects/sqlitebrowser/ I took it from your post that you'd checked for the database, but not looked inside at the tables yet?

I think you have do to this with a database created from running on the emulator unless your phone is rooted or something.

You can then check whether your database has all the correct tables and fields. Also you can run your SQL table creation / insertion code before running it in the code and having to guess at the issue.

Only issue is that sometimes it just breaks if the SQL is invalid. It's not going to do you any favours like Navicat, but it'll work if your SQL is correct.



来源:https://stackoverflow.com/questions/21370294/populating-an-android-sqlite-database

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!