1

我在将数据保存到使用 SQLITE 数据库浏览器预先创建的 sqlite 数据库时遇到问题。我将数据库存储在资产文件夹中。

这是我使用的代码:

ApplicationContextProvider 类:

import android.app.Application;
import android.content.Context;
public class ApplicationContextProvider extends Application {

private static Context sContext;

public void onCreate() {
        super.onCreate();
sContext = getApplicationContext();

}

public static Context getContext() {
    return sContext;
}

}

我的 DatabaseHelper 类:

public class DataBaseHelper extends SQLiteOpenHelper {

// The Android's default system path of your application database.
//data/data/ and /databases remain the same always. The one that must be changed is com.example which represents
//the MAIN package of your project
private static String DB_PATH = "/data/data/com.fps/databases/";

//the name of your database
private static String DB_NAME = "bmiDB";

private static SQLiteDatabase mDataBase;

private static DataBaseHelper sInstance = null;
// database version    
private static final int DATABASE_VERSION = 1;

/**
 * Constructor Takes and keeps a reference of the passed context in order to
 * access to the application assets and resources.
 */
private DataBaseHelper() {
    super( ApplicationContextProvider.getContext(), DB_NAME, null, DATABASE_VERSION );

    try {
        createDataBase();
        openDataBase();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

/**
 * Singleton for DataBase
 *
 * @return singleton instance
 */
public static DataBaseHelper instance() {

    if ( sInstance == null ) {
        sInstance = new DataBaseHelper();
    }
    return sInstance;
}

/**
 * Creates a empty database on the system and rewrites it with your own
 * database.
 *
 * @throws java.io.IOException io exception
 */
private void createDataBase() throws IOException {

    boolean dbExist = checkDataBase();

    if ( dbExist ) {
        // do nothing - database already exist
    } else {

        // By calling this method an empty database will be created into
        // the default system path
        // of your application so we are gonna be able to overwrite that
        // database with our database.
        this.getReadableDatabase();

        try {

            copyDataBase();

        } catch ( IOException e ) {

            throw new Error( "Error copying database" );
        }
    }
}

/**
 * Check if the database already exist to avoid re-copying the file each
 * time you open the application.
 *
 * @return true if it exists, false if it doesn't
 */
private boolean checkDataBase() {

    SQLiteDatabase checkDB = null;

    try {
        String myPath = DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase( myPath, null,
                SQLiteDatabase.OPEN_READONLY );

    } catch ( SQLiteException e ) {

        // database doesn't exist yet.

    }

    if ( checkDB != null ) {

        checkDB.close();

    }

    return checkDB != null;
}

/**
 * Copies your database from your local assets-folder to the just created
 * empty database in the system folder, from where it can be accessed and
 * handled. This is done by transfering bytestream.
 *
 * @throws java.io.IOException io exception
 */
public void copyDataBase() throws IOException {

    // Open your local db as the input stream
    InputStream myInput = ApplicationContextProvider.getContext().getAssets().open( DB_NAME );

    // Path to the just created empty db
    String outFileName = DB_PATH + DB_NAME;

    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream( outFileName );

    // transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[ 1024 ];
    int length;
    while ( ( length = myInput.read( buffer ) ) > 0) {
        myOutput.write( buffer, 0, length );
    }

    // Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();

}

private void openDataBase() throws SQLException {

    // Open the database
    String myPath = DB_PATH + DB_NAME;
    mDataBase = SQLiteDatabase.openDatabase( myPath, null,
            SQLiteDatabase.OPEN_READWRITE );
}

/**
 * Select method
 *
 * @param query select query
 * @return - Cursor with the results
 * @throws android.database.SQLException sql exception
 */
public Cursor select( String query ) throws SQLException {
    return mDataBase.rawQuery( query, null );
}

/**
 * Insert method
 *
 * @param table  - name of the table
 * @param values values to insert
 * @throws android.database.SQLException sql exception
 */

public void insert( String table, ContentValues values ) throws SQLException {
    mDataBase.insert( table, null, values );
}

/**
 * Delete method
 *
 * @param table - table name
 * @param where WHERE clause, if pass null, all the rows will be deleted
 * @throws android.database.SQLException sql exception
 */
public void delete( String table, String where ) throws SQLException {

    mDataBase.delete( table, where, null );

}

/**
 * Update method
 *
 * @param table  - table name
 * @param values - values to update
 * @param where  - WHERE clause, if pass null, all rows will be updated
 */
public void update( String table, ContentValues values, String where ) {

    mDataBase.update( table, values, where, null );

}

/**
 * Let you make a raw query
 *
 * @param command - the sql comand you want to run
 */


public void sqlCommand( String command ) {
    mDataBase.execSQL( command );
}

@Override
public synchronized void close() {

    if (mDataBase != null)
        mDataBase.close();

    super.close();

}

@Override
public void onCreate( SQLiteDatabase db ) {

}

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

}

}

以及方法 viewSavedToast() 中的一段代码:

AlertDialog ad = new AlertDialog.Builder( this ).create();
    //ad.setCancelable( true );
    ad.setTitle( "Successful" );
    ad.setMessage( "You're result is saved in the database!" );
    ad.setButton( "OK", new DialogInterface.OnClickListener() {  
        public void onClick( DialogInterface dialog, int which ) {  
            //with ContentValues put the data we want into the database
            ContentValues values = new ContentValues();
            String column_name = etanswer.getText().toString();
            values.put( COLUMN_NAME, column_name  );

            //here we insert the data we have put in values
            dataBase.insert( TABLE_NAME, values );
            dialog.dismiss();           
            }  
    });  
    ad.show(); 

当我运行应用程序,将数据保存到数据库时,onClick() 方法出现错误?问题是什么?我相信我遵循了我在这里找到的教程中的所有步骤:http: //myandroidsolutions.blogspot.com/2012/07/android-database-tutorial.html但不知何故我得到了一个错误。

日志:

    10-17 20:50:11.118: E/AndroidRuntime(368): FATAL EXCEPTION: main
    10-17 20:50:11.118: E/AndroidRuntime(368): java.lang.NullPointerException
    10-17 20:50:11.118: E/AndroidRuntime(368):  at                                    com.fps.iHealthFirst.BMICalculator.viewBMISavedToast(BMICalculator.java:121)
    10-17 20:50:11.118: E/AndroidRuntime(368):  at com.fps.iHealthFirst.BMICalculator.calculateMen(BMICalculator.java:194)
10-17 20:50:11.118: E/AndroidRuntime(368):  at com.fps.iHealthFirst.BMICalculator.onClick(BMICalculator.java:143)
10-17 20:50:11.118: E/AndroidRuntime(368):  at android.view.View.performClick(View.java:2485)
10-17 20:50:11.118: E/AndroidRuntime(368):  at android.view.View$PerformClick.run(View.java:9080)
10-17 20:50:11.118: E/AndroidRuntime(368):  at android.os.Handler.handleCallback(Handler.java:587)
4

1 回答 1

1

尝试使用构建器创建对话框来设置属性并在显示它之前创建 AlertDialog,如下所示:

AlertDialog.Builder builder = new AlertDialog.Builder( this );
    builder.setTitle( "Successful" )
    .setMessage( "You're result is saved in the database!" )
    .setButton( "OK", new DialogInterface.OnClickListener() {           
        public void onClick( DialogInterface dialog, int which ) {
           // ...
        }
    });       
 AlertDialog ad = builder.create();
 ad.show();  
于 2012-10-17T13:47:51.500 回答