0

次のコードを見てください

フォーム.java

Form.java は Main アクティビティで、最初のページの Java ファイルを意味します。「リスト」とメニューの作成に関連する多くのコードが削除されました。

  package com.example.esoftcallmanager;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class Form extends Activity {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_form);

        DatabaseConnector databaseConnector = new DatabaseHandler(); 
        databaseConnector.createConnection();

        ListView lv = (ListView)findViewById(android.R.id.list);
        String arr[] = getResources().getStringArray(R.array.branch_list);

        //lv.setAdapter(new MyAdapter(this,android.R.layout.simple_list_item_1,R.id.listText,arr));

        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
            // TODO Auto-generated method stub


            }
            });
    }
}

DataBaseConnector.java

これは、データベース アクションを実行するコードのインターフェイスです。

package com.example.esoftcallmanager;

public interface DatabaseConnector 
{
    public void createConnection();
    public void closeConnection();
    public String getPhoneNumber();
}

DataBaseHandler.java

これは、データベース操作を実行するものです

package com.example.esoftcallmanager;

import android.app.Activity;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.widget.Toast;

public class DatabaseHandler extends Activity implements DatabaseConnector
{
    private SQLiteDatabase database;
    private String dbPath = "data//data//com.example.esoftcallmanager.sqllite//esoftDatabase";

    @Override
    public void createConnection() 
    {

        try
        {
            database = this.openOrCreateDatabase("esoftDatabase", MODE_PRIVATE, null);

        database.execSQL("create table BranchNetwork(" +
                "brID integer primary key autoincrement,"
                +"city text,"
                +"steetAddress text"
                +"phoneNumber1 text"
                +"phoneNumber2 text"
                +"email text"
                +");");
        }
        catch(SQLException sql)
        {
            Toast.makeText(this, sql.getMessage(), Toast.LENGTH_LONG).show();
        }

    }

    @Override
    public void closeConnection() {
        // TODO Auto-generated method stub

    }

    @Override
    public String getPhoneNumber() {
        // TODO Auto-generated method stub
        return null;
    }

}

ただし、次のエラーが発生するため、コードを実行できません。

02-11 20:35:59.350: D/dalvikvm(434): GC_EXTERNAL_ALLOC freed 52K, 53% free 2552K/5379K, external 1949K/2137K, paused 80ms
02-11 20:40:34.021: D/dalvikvm(1131): GC_EXTERNAL_ALLOC freed 42K, 53% free 2552K/5379K, external 1949K/2137K, paused 122ms
02-11 20:40:34.361: D/AndroidRuntime(1131): Shutting down VM
02-11 20:40:34.361: W/dalvikvm(1131): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-11 20:40:34.401: E/AndroidRuntime(1131): FATAL EXCEPTION: main
02-11 20:40:34.401: E/AndroidRuntime(1131): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.esoftcallmanager/com.example.esoftcallmanager.Form}: java.lang.NullPointerException
02-11 20:40:34.401: E/AndroidRuntime(1131):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
02-11 20:40:34.401: E/AndroidRuntime(1131):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-11 20:40:34.401: E/AndroidRuntime(1131):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-11 20:40:34.401: E/AndroidRuntime(1131):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-11 20:40:34.401: E/AndroidRuntime(1131):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-11 20:40:34.401: E/AndroidRuntime(1131):     at android.os.Looper.loop(Looper.java:123)
02-11 20:40:34.401: E/AndroidRuntime(1131):     at android.app.ActivityThread.main(ActivityThread.java:3683)
02-11 20:40:34.401: E/AndroidRuntime(1131):     at java.lang.reflect.Method.invokeNative(Native Method)
02-11 20:40:34.401: E/AndroidRuntime(1131):     at java.lang.reflect.Method.invoke(Method.java:507)
02-11 20:40:34.401: E/AndroidRuntime(1131):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-11 20:40:34.401: E/AndroidRuntime(1131):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-11 20:40:34.401: E/AndroidRuntime(1131):     at dalvik.system.NativeStart.main(Native Method)
02-11 20:40:34.401: E/AndroidRuntime(1131): Caused by: java.lang.NullPointerException
02-11 20:40:34.401: E/AndroidRuntime(1131):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
02-11 20:40:34.401: E/AndroidRuntime(1131):     at com.example.esoftcallmanager.DatabaseHandler.createConnection(DatabaseHandler.java:19)
02-11 20:40:34.401: E/AndroidRuntime(1131):     at com.example.esoftcallmanager.Form.onCreate(Form.java:30)
02-11 20:40:34.401: E/AndroidRuntime(1131):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-11 20:40:34.401: E/AndroidRuntime(1131):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
02-11 20:40:34.401: E/AndroidRuntime(1131):     ... 11 more
02-11 20:40:37.381: I/Process(1131): Sending signal. PID: 1131 SIG: 9

Form.java からデータベース接続部分を削除するたびに、これは正常に機能します。したがって、エラーは次のコードにある必要があります

DatabaseConnector databaseConnector = new DatabaseHandler();
        databaseConnector.createConnection();

Form.java にすべてのデータベース操作を追加したくありません。私がやったように、仕事を分割する必要があります。しかし、どうすればそれを行うことができますか?助けてください!

4

2 に答える 2

2

私が見たものは次のとおりです。

    database.execSQL("create table BranchNetwork(" +
            "brID integer primary key autoincrement,"
            +"city text,"
            +"steetAddress text"
            +"phoneNumber1 text"
            +"phoneNumber2 text"
            +"email text"
            +");");

あなたは書く必要があります:

    database.execSQL("create table BranchNetwork(" +
            "brID integer primary key autoincrement,"
            +"city text,"
            +"steetAddress text," //forgot comma
            +"phoneNumber1 text," //forgot comma
            +"phoneNumber2 text," // forgot commas
            +"email text"
            +");");

これが間違いだったかどうかはわかりませんが、試してみてください...

于 2013-02-11T15:31:52.310 に答える
2

が Activity クラスではない場合DatabaseHandler、 Activity をそれに拡張する必要はありません。DatabaseHandlerdatabase を作成するために Activity コンテキストを渡すために、パラメーター化されたコンストラクターを作成する必要があります。DatabaseHandler クラスを次のように変更します。

public class DatabaseHandler implements DatabaseConnector
{
    private SQLiteDatabase database;
     ....
    Context context;

   public DatabaseHandler(Context context){

       this.context=context;
   }

    @Override
    public void createConnection() 
    {

        try
        {
            database = context.openOrCreateDatabase("esoftDatabase", 
                           MODE_PRIVATE, null);
            // your code here....
        }
        catch(SQLException sql)
        {
            Toast.makeText(context, sql.getMessage(), 
                    Toast.LENGTH_LONG).show();
        }

    }

Form Activity から Activity Context を渡します。

DatabaseConnector databaseConnector = 
                    new DatabaseHandler(Form.this);
databaseConnector.createConnection();
于 2013-02-11T15:32:22.637 に答える