0

このデータベースを作成するためにシングルトンクラスを使用しようとしています。これは、アプリケーションの各アクティビティに対してデータベースを開く必要があるためです。「getFilesDir」または「if(instance == null)」呼び出しのいずれかからnullポインターエラーが発生し続けます。また、Androidプログラミングにあまり詳しくないため、何が起こっているのかわかりません。

package com.database;

import java.io.File;

import android.app.Application;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.util.Log;

import com.businessclasses.Field;
import com.db4o.Db4oEmbedded;
import com.db4o.ObjectContainer;
import com.db4o.config.AndroidSupport;
import com.db4o.config.EmbeddedConfiguration;

public final class anotherTest extends Application {
    private static ObjectContainer playsDB;
    private static ObjectContainer gamePlanDB;

    private anotherTest instance;

    public anotherTest(){

        final EmbeddedConfiguration config = Db4oEmbedded.newConfiguration();
        config.common().add(new AndroidSupport());
        //instance.getFilesDir().getPath()
        new File(getFilesDir().getPath(), "/PlaysDB.db4o").delete();

        Log.d("db", "" + instance.getFilesDir().getPath());
        //getFilesDir().getPath();
        //String appPath = "/data/data/PlaysDB/database";

        playsDB = Db4oEmbedded.openFile(config, getFilesDir().getPath() +     "/PlaysDB.db4o");
        //File test = new File(appPath + "/PlaysDB.db4o");
        //if(test != null){
        //  Log.d("db", "file was created");
        //  Log.d("db", "path >> " + test.getAbsolutePath());
            //test.delete();
        //}

        //playsDB = Db4oEmbedded.openFile(config, appPath + "/PlaysDB.db4o");
    }

    public synchronized anotherTest getInstance(){
        if(instance == null){
            instance = new anotherTest();
        }
        return instance;
    }

    public void storePlay(Field field){
        if(field != null){
            if(playsDB == null){
                Log.d("db", "database is null");
            }
            playsDB.store(field);
            playsDB.commit();
            Log.d("added play", "play added to db");    
        }
        else{
            Log.e("field input null", "play not added to db");
        }
    }   
}

そして、これが活動の1つでの私の呼びかけです。

   public void onClick(View v) {
        String formation = playFormation.getText().toString();
        String name = playName.getText().toString();
        String type = playType.getSelectedItem().toString();
        //TODO:send to database

        Field newField = new Field();
        newField.setPlayName(name);
        newField.setPlayType(type);

        anotherTest temp = new anotherTest();
        temp.getInstance().storePlay(newField);
    }

過去数週間、このデータベースを機能させようとしてきましたが、役に立たなかったのです。任意のヘルプやガイダンスをいただければ幸いです。

4

1 に答える 1

1

これが構造化されている方法は意味がありません。

  • Javaクラスには常に適切な大文字と小文字が区別されるため、「AnotherTest」にする必要があります。
  • インスタンスもgetInstance()も静的ではないため、実際にはシングルトンを作成していません。また、「getInstance()」を介してインスタンスにアクセスすることはありません。
  • クラスAnotherTestがあります。このクラスには、AnotherTestのインスタンスがあります。これは、決して初期化されることはなく、AnotherTestのコンストラクターでアクセスされます。これはnullであることが保証されています。
  • アプリケーションはandroidmanifest.xmlで宣言されることになっているため、アプリケーションスーパークラスの暗黙的な状態に依存していますが、これは決して提供されません。一方、イベントハンドラーでインスタンスを手動で構築しているため、期待する状態はありませんが、前述のように、nullポインターを参照しようとするため、とにかく、インスタンスは独自のコンストラクターにフォールオーバーします。

あなたの問題はDB40とは何の関係もありません、そしてあなたが何をしているのか理解していないことと関係があります。

次のようにする必要があります。

public final class AnotherTest {


    private static AnotherTest instance;

    private final Context context;

    private AnotherTest(Context context){
        this.context = context;

        // Do whatever you need to do with DB4O using *only* the supplied context here
    }

    public static synchronized AnotherTest getInstance(Context context){
        if(instance == null){
            instance = new AnotherTest(context);
        }
        return instance;
    }
}

そして、イベントハンドラーで:

AnotherTest.getInstance(Context.getApplicationContext()).storePlay(newField);
于 2012-11-08T09:57:04.557 に答える