简体   繁体   中英

Android Database Connectivity Failure

My project requires a user to do the data entry in a page . These values that are entered by the user must be stored in the database and display when asked to retrieve. when i run the application and i enter values in the UI and submit to the database. It simply closes after a while and does nothing.Please help me find way to connect to the database and get the values updated. Thanks

The below are the codes for three of my classes

MainActivity.java

package pack.dannyzdatabase;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.SQLException;
import java.util.Date;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

DatabaseAdapter db = new DatabaseAdapter();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button bttn2 = (Button) findViewById(R.id.button2);


    bttn2.setOnClickListener(new OnClickListener(){


        @Override
        public void onClick(View v) {
            Intent intent=new Intent(MainActivity.this,ViewActivity.class);
            startActivity(intent);

        }
    });

    try {
        String destPath = "/data/data/" + getPackageName() + "/databases/AndyXDb";
                 File f = new File(destPath);
                 if (!f.exists()) {
                 CopyDB( getBaseContext().getAssets().open("mydb"),
                 new FileOutputStream(destPath));
                 }
                 } catch (FileNotFoundException e) {
                 e.printStackTrace();
                 } catch (IOException e) {
                 e.printStackTrace();
                 }
}

private void CopyDB(InputStream inputStream, OutputStream outputStream) 
throws IOException {
    byte[] buffer = new byte[1024];
    int length;
    while ((length = inputStream.read(buffer)) > 0){
        outputStream.write(buffer,0,length);
    }
    inputStream.close();
    outputStream.close();

}

}

The following is the DatabaseAdapter class,DatabaseAdapter.java

package pack.dannyzdatabase;

import java.sql.SQLException;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public  class DatabaseAdapter {
public static final String KEY_TIMESTAMP = "Timestamp";
public static final String KEY_UNIQUEID = "Unique ID";
public static final String KEY_DEVICETYPE = "Device Type";
public static final String KEY_RSSI = "RSSI";
public static final String TAG = "DBAdapter";

private static final String DATABASE_NAME="DannyzDb";
private static final int DATABASE_VERSION=1;
private static final String DATABASE_TABLE="DannyzData";

private static final String DATABASE_CREATE= "create table if not exist DannyzData( Timestamp TIMESTAMP, Unique ID BLOB," +
        "Device Type VARCHAR, RSSI INTEGER PRIMARY KEY NOT NULL);";

//private final Context context;

private DataBaseHelper DBHelper;
private SQLiteDatabase db;

private 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 (SQLiteException e) {
            e.printStackTrace();
            }
        }



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


//Opens the database

public DatabaseAdapter open() throws SQLException{
    db=DBHelper.getWritableDatabase();
    return this;
    }

//closes the database

public void close(){
    DBHelper.close();
}

//Insert a record into database

public long insertRecord(String Timestamp, String UniqueId, String DeviceType, String RSSI){
    ContentValues intialValues = new ContentValues();
    intialValues.put(KEY_TIMESTAMP,Timestamp);
    intialValues.put(KEY_UNIQUEID,UniqueId);
    intialValues.put(KEY_DEVICETYPE,DeviceType);
    intialValues.put(KEY_RSSI,RSSI);


    return db.insert(DATABASE_TABLE,null,intialValues);
}

// deletes a particular record

    public boolean deleteRecord(long rssi)
    {
        return db.delete(DATABASE_TABLE,KEY_RSSI + "=" + rssi,null)>0;
        }

      // retrieves all the records

     public Cursor getAllRecords(){
     return db.query(DATABASE_TABLE,new String[] {KEY_TIMESTAMP,KEY_UNIQUEID,KEY_DEVICETYPE,KEY_RSSI},null,null,null,null,null);

}



//Updates a record

public boolean updateRecord(long rssi,String timestamp,String uniqueId,String      DeviceType, String RSSI, String Timestamp, String UniqueId){
ContentValues args = new ContentValues();
args.put(KEY_TIMESTAMP,Timestamp);
args.put(KEY_UNIQUEID,UniqueId);
args.put(KEY_DEVICETYPE,DeviceType);
return db.update(DATABASE_TABLE,args,KEY_RSSI + "=" + rssi,null)>0;
}
}   

here is another class ViewActivity.java

package pack.dannyzdatabase;

import java.sql.SQLException;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class ViewActivity extends Activity 
{
DatabaseAdapter db = new DatabaseAdapter();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view);

    }

public void ViewActivity(View v)
{

EditText txt1 = (EditText) findViewById(R.id.editText1);
EditText txt2 = (EditText) findViewById(R.id.editText2);
EditText txt3 = (EditText) findViewById(R.id.editText3);
EditText txt4 = (EditText) findViewById(R.id.editText4);

try {
    db.open();
} catch (SQLException e) {

    e.printStackTrace();
}

long id = db.insertRecord(txt1.getText().toString(),
txt2.getText().toString(),txt3.getText().toString(),
txt4.getText().toString());
db.close();


txt1.setText("");
txt2.setText("");
txt3.setText("");
txt4.setText("");
Toast.makeText(ViewActivity.this,"Viewing Activity",Toast.LENGTH_LONG).show();
}


public void ViewAct (View v)
{
Intent intent = new Intent(this,MainActivity.class);
startActivity(intent);
}

}

Android manifest code is here

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="pack.andyxdatabase"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="19" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="pack.andyxdatabase.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

Your DataBaseHelper class needs the context from your MainActivity class, not your DatabaseAdapter class. You need to change your activity code to something like this:

DatabaseAdapter db;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    db = new DatabaseAdapter(this);

    setContentView(R.layout.activity_main);

}

Then your DatabaseAdapter class needs to change to something like this:

public DatabaseAdapter(Context context) {

    DBHelper = new DataBaseHelper(context);

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM