无法连接到android中的现有数据库

时间:2015-04-12 02:34:05

标签: java android database sqlite

我在连接数据库时遇到了一些麻烦。所以我有一个名为HealthySizing的数据库,这也是文件的名称,没有像.sqlite3或.db那样的扩展名,这个表有你需要的元表,还有一个名为Shirts的表, 6列,但它没有任何ID列。此数据库位于我的资源文件夹中。因此,当我运行我的应用程序时,我得到的唯一错误是它无法创建或打开数据库。我在DBHelper.java,MainActivity.java和activity_main.xml下面发布了。如果有人可以帮助我解决这个问题并让数据从数据库中出来,那就太好了。

package com.example.ListViewFromSQLiteDB;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Locale;

public class DBHelper extends SQLiteOpenHelper {

    private static final String DATABASE_PATH = "/data/data/com.example.ListViewFromSQLiteDB/databases";
    private static final String DATABASE_NAME = "HealthySizing";
    private static final int SCHEMA_VERSION = 3;
    public SQLiteDatabase dbSqlite;
    private final Context myContext;
    public static String tableName = "Shirts";

    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, SCHEMA_VERSION);
        this.myContext = context;
    }

    public void onCreate(SQLiteDatabase db) {

    }

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

    }

    public void createDatabase() {
        createDB();
    }

    private void createDB() {

        boolean dbExist = DBExists();

        if (!dbExist) {

            this.getReadableDatabase();
            copyDBFromResource();

        }

    }

    private boolean DBExists() {

        SQLiteDatabase db = null;

        try {

            String databasePath = DATABASE_PATH + DATABASE_NAME;
            db = SQLiteDatabase.openDatabase(databasePath, null, SQLiteDatabase.OPEN_READWRITE);
            db.setLocale(Locale.getDefault());
            db.setLockingEnabled(true);
            db.setVersion(1);

        } catch (SQLiteException e) {
            Log.e("SqlHelper", "database not found");
        }

        if (db != null) {
            db.close();
        }

        return db != null ? true : false;

    }

    private void copyDBFromResource() {

        InputStream inputStream = null;
        OutputStream outStream = null;
        String dbFilePath = DATABASE_PATH + DATABASE_NAME;

        try {

            inputStream = myContext.getAssets().open(DATABASE_NAME);
            outStream = new FileOutputStream(dbFilePath);

            byte[] buffer = new byte[1024];
            int length;

            while((length = inputStream.read(buffer)) > 0) {
                outStream.write(buffer, 0, length);
            }

            outStream.flush();
            outStream.close();
            inputStream.close();

        } catch (IOException e) {
            throw new Error("Problem copying database from resource file");
        }

    }

    @Override
    public synchronized void close() {
        if (dbSqlite != null) {
            dbSqlite.close();
        }
        super.close();
    }

}
package com.example.ListViewFromSQLiteDB;

import java.sql.SQLException;
import java.util.ArrayList;
import android.app.ListActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class MainActivity extends ListActivity {

    private ArrayList<String> results = new ArrayList<String>();
    private String tableName = DBHelper.tableName;
    private SQLiteDatabase newDB;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DBHelper dbHelper = new DBHelper(this.getApplicationContext());
        openAndQueryDatabase();
        displayResultList();
    }

    private void displayResultList() {
        TextView tView = new TextView(this);
        //tView.setText("This data is retrieved from the database and only 4 " +
        //        "of the results are displayed");
        getListView().addHeaderView(tView);

        setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, results));
        getListView().setTextFilterEnabled(true);

    }

    private void openAndQueryDatabase() {
        try {

            DBHelper dbHelper = new DBHelper(this.getApplicationContext());
            newDB = dbHelper.getWritableDatabase();

            Cursor c = newDB.rawQuery("SELECT Name FROM " +
                    tableName, null);

            if (c != null ) {

                if  (c.moveToFirst()) {

                    do {

                        String name = c.getString(c.getColumnIndex("Name"));
                        results.add(name);

                    } while (c.moveToNext());

                }
            //c.close();
            }

            //String name = c.getString(c.getInt(1));
            //results.add(name);
            //c.close();

        }

        catch (SQLiteException se ) {
            Log.e(getClass().getSimpleName(), "Could not create or Open the database");
        }

        finally {
            try {
                if (newDB != null){
                    newDB.execSQL("DELETE FROM " + tableName );

                newDB.close();
                }
            } catch (SQLiteException e) {
                e.printStackTrace();
            }
        }

    }

}
04-11 19:26:00.728    1933-1933/com.example.ListViewFromSQLiteDB I/art﹕ Not late-enabling -Xcheck:jni (already on)
04-11 19:26:00.798    1933-1933/com.example.ListViewFromSQLiteDB E/MainActivity﹕ Could not create or Open the database
04-11 19:26:00.838    1933-1945/com.example.ListViewFromSQLiteDB W/art﹕ Suspending all threads took: 8.691ms
04-11 19:26:00.854    1933-1945/com.example.ListViewFromSQLiteDB I/art﹕ Background sticky concurrent mark sweep GC freed 1680(81KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 689KB/689KB, paused 12.131ms total 28.447ms
04-11 19:26:00.890    1933-1948/com.example.ListViewFromSQLiteDB D/OpenGLRenderer﹕ Render dirty regions requested: true
04-11 19:26:00.894    1933-1933/com.example.ListViewFromSQLiteDB D/﹕ HostConnection::get() New Host Connection established 0xae0f8ee0, tid 1933
04-11 19:26:00.902    1933-1933/com.example.ListViewFromSQLiteDB D/Atlas﹕ Validating map...
04-11 19:26:00.955    1933-1948/com.example.ListViewFromSQLiteDB D/﹕ HostConnection::get() New Host Connection established 0xae0f8f90, tid 1948
04-11 19:26:00.970    1933-1948/com.example.ListViewFromSQLiteDB I/OpenGLRenderer﹕ Initialized EGL, version 1.4
04-11 19:26:00.983    1933-1948/com.example.ListViewFromSQLiteDB D/OpenGLRenderer﹕ Enabling debug mode 0
04-11 19:26:00.998    1933-1948/com.example.ListViewFromSQLiteDB W/EGL_emulation﹕ eglSurfaceAttrib not implemented
04-11 19:26:00.999    1933-1948/com.example.ListViewFromSQLiteDB W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa6c83c00, error=EGL_SUCCESS
04-11 19:26:12.961    1933-1933/com.example.ListViewFromSQLiteDB E/MainActivity﹕ Could not create or Open the database
04-11 19:26:13.103    1933-1948/com.example.ListViewFromSQLiteDB W/EGL_emulation﹕ eglSurfaceAttrib not implemented
04-11 19:26:13.103    1933-1948/com.example.ListViewFromSQLiteDB W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa6c83c00, error=EGL_SUCCESS

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:weightSum="1">
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello"
        android:layout_weight="0.12" />
</LinearLayout>

0 个答案:

没有答案