2014-07-09 142 views
0

我的项目需要用户在页面中输入数据。这些由用户输入的值必须存储在数据库中,并在要求检索时显示。当我运行应用程序时,我在UI中输入值并提交给数据库。它会在一段时间后关闭,什么都不做。请帮助我找到连接到数据库并更新值的方法。由于Android数据库连接失败

以下是我的三个班

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(); 

} 

} 

下面的代码是DatabaseAdapter类,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; 
} 
} 

这里是另一个类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清单代码在这里

<?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> 
+0

检查此链接http://www.vogella.com/教程/ AndroidSQLite/article.html#sqliteoverview_sqliteopenhelper和更好的邮政编码,在您的应用程序中引发错误,不是所有的 –

+0

显示我的清单文件? – Guru

回答

0

您的DataBaseHelper类需要来自MainActivity类的上下文,而不是您的DatabaseAdapter类。你需要改变你的活动代码是这样的:

DatabaseAdapter db; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    db = new DatabaseAdapter(this); 

    setContentView(R.layout.activity_main); 

} 

然后你DatabaseAdapter类需要改变这样的事情:

public DatabaseAdapter(Context context) { 

    DBHelper = new DataBaseHelper(context); 

}