2017-08-24 64 views
0

我想创建一个应用程序,它需要用户输入主题名称和子代码,并且该子代码将用作字段名称来创建数据库Table.But在创建时收到空指针异常数据库甚至共享首选项正在被保存。如何通过从共享首选项获取字段来创建数据库?

这不是一个“context.getSharedPreference问题”请看看。

public class Check_regularHelper extends SQLiteOpenHelper { 

    Context mcontext=null; 
    public static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_NAME = "Check_regular.db"; 
    SharedPreferences pref; 

    private String createCMD(){ 
     String s = ""; 
     int total=pref.getInt("sno",0); 
     for(int i=1;i<=total;i++){ 
      s += pref.getString(String.valueOf(i),"") + " INTEGER DEFAULT 0"; 
      if(i!=total){ 
       s+=", "; 
      } 
     } 
     return s; 
    } 

    public String SQL_CREATE_ENTRIES = "CREATE TABLE "+ SubContract.Check_Regular.TABLE_NAME 
      + " (" + SubContract.Check_Regular.DATE + " TEXT PRIMARY KEY," + createCMD() +");"; 

    public Check_regularHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     mcontext=context; 
     this.pref = context.getSharedPreferences(subjectFill.Subjects,Context.MODE_PRIVATE); 
     if(pref==null) Log.e(context.toString(),"fine-----------------"); 
     if(pref!=null) Log.e(context.toString(),"wrong-----------------"); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(SQL_CREATE_ENTRIES); 

    } 

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

    } 
} 

08-24 19:21:06.184 8226-8226/com.creator.innov.check_regular E/AndroidRuntime: FATAL EXCEPTION: main 
                       Process: com.creator.innov.check_regular, PID: 8226 
                       java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.creator.innov.check_regular/com.creator.innov.check_regular.DailyTimeTable.Check_regularSubject}: java.lang.NullPointerException: Attempt to invoke interface method 'int android.content.SharedPreferences.getInt(java.lang.String, int)' on a null object reference 
                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2334) 
                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2483) 
                        at android.app.ActivityThread.access$900(ActivityThread.java:153) 
                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349) 

即使我试图检查是否sharedPreferences为空或不是,它没有表现出任何的事情。请帮助

回答

-1

尝试使用的应用程序上下文来获取共享偏好:

public class App extends Application { 

    public static Application application; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     application = this; 

    } 

    public static Application get(){ 
     return application; 
    } 
} 

添加在清单应用程序标记机器人:名字= “应用程序”。

public class Helper extends SQLiteOpenHelper { 

       private static final String DB_NAME = "sample.db"; 
       private static final int VERSION = 1; 
       private String CREATE = 
         "CREATE TABLE " + "%s" 
           + "(" 
           + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 
           + "%s TEXT," 
           + "%s TEXT" 
           + ");"; 

       public Helper(Context context) { 
        super(context, DB_NAME, null, VERSION); 
       } 

       @Override 
       public void onCreate(SQLiteDatabase sqLiteDatabase) { 
        Context appContext = App.get(); 
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(appContext); 

        String tableName = sharedPreferences.getString("TABLE_NAME", "TABLE1"); 

        String column1 = sharedPreferences.getString("COLUMN1", "COLUMN1"); 
        String column2 = sharedPreferences.getString("COLUMN2", "COLUMN2"); 

        String formatted = String.format(CREATE, tableName, column1, column2); 

        sqLiteDatabase.execSQL(formatted); 
       } 

       @Override 
       public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { 

       } 
      } 
+0

你是天才man.Thanks Man。 .. :) – Creatorcool

1

赋值字符串SQL_CREATE_ENTRIES在pref被初始化之前被赋值,这就是为什么pref为空的原因。

试试这个方法:

public String SQL_CREATE_ENTRIES ; 

    public Check_regularHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     mcontext=context; 
     this.pref = context.getSharedPreferences(subjectFill.Subjects,Context.MODE_PRIVATE); 
     if(pref==null) Log.e(context.toString(),"fine-----------------"); 
     if(pref!=null) { 
      Log.e(context.toString(),"wrong-----------------"); 

      SQL_CREATE_ENTRIES = "CREATE TABLE "+ SubContract.Check_Regular.TABLE_NAME 
      + " (" + SubContract.Check_Regular.DATE + " TEXT PRIMARY KEY," + createCMD() +");"; 
      } 
    } 
+0

不,仍然存在错误...“由...引发:java.lang.NullPointerException:试图调用接口方法int android.content.SharedPreferences.getIn t(java.lang.String,int)'空对象引用“ – Creatorcool

+0

然后你可以在检查'preg'不是null之后进行赋值,就像我刚刚更新的代码 – dmastra