2017-03-31 90 views
0

我已經搜索了很長的這個問題的答案,但還沒有找到。 我在做項目與SQLiteDatabase。一切工作正常,除了分配SQLiteOpenHelper到我的CustomAdapter。我在Android工作室和所有這些Java工具大約兩個月,所以我只是在互聯網上搜索幾乎所有東西。這裏是我的項目的片段。如何在自定義適配器中分配SQLiteOpenHelper?

SQLiteOpenHelper:

public class ActivitiesDataBase extends SQLiteOpenHelper { 
 

 
    public static final String DATABASE_NAME = "database.db"; 
 
    public static final String ACTIVITIES_COLUMN_ID = "id"; 
 
    public static final String ACTIVITIES_TABLE_NAME = "create_activity"; 
 
    public static final String ACTIVITIES_COLUMN_NAME = "activity"; 
 
    public static final String ACTIVITIES_COLUMN_NUMBER = "number"; 
 
    public static final String ACTIVITIES_COLUMN_DESCRIPTION = "description"; 
 
    
 
    
 
    
 
    //Created command to create items 
 
    public void addactivity(String activity, String description, String number){ 
 

 
     SQLiteDatabase db = this.getWritableDatabase(); 
 
     ContentValues cv =new ContentValues(); 
 
     cv.put(ACTIVITIES_COLUMN_NAME, activity); 
 
     cv.put(ACTIVITIES_COLUMN_NUMBER, number); 
 
     cv.put(ACTIVITIES_COLUMN_DESCRIPTION, description); 
 

 
     db.insert(ACTIVITIES_TABLE_NAME, null, cv); 
 
     db.close(); 
 
    } 
 
    
 
    
 
    
 
    
 
    //Constructor 
 
     public ActivitiesDataBase(Context context) { 
 
     super(context, DATABASE_NAME, null, 1); 
 
    } 
 

 
    @Override 
 
    public void onCreate(SQLiteDatabase db) { 
 

 
     db.execSQL("CREATE TABLE create_activity" + 
 
       "(id INTEGER PRIMARY KEY, " + 
 
       "activity TEXT, " + 
 
       "number TEXT, " + 
 
       "description TEXT)"); 
 

 
    } 
 

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

 
     db.execSQL("DROP TABLE IF EXISTS create_activity"); 
 

 
    } 
 
}

ActivityMain的小部分:

public class MainActivity extends AppCompatActivity implements DrawerLocker { 
 

 
//Assigning SQLiteOpenHelper, no errors, result is fine. 
 
    final ActivitiesDataBase db = new ActivitiesDataBase(this); 
 
    
 
    private SQLiteDatabase sql; 
 
    
 
@Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_main); 
 

 
//Here I call command addactivity and it works fine, because I 
 
//assigned SQLiteOpenHelper well. 
 
    db.addactivity(activitysubject, activitydesc, activitynum); 
 
    
 
    } 
 
}

這裏是我的自定義適配器:

public class CustomAdapter extends ArrayAdapter { 
 

 
    private List sarasas = new ArrayList(); 
 

 
    public CustomAdapter(Context context, int resource) { 
 
     super(context, resource); 
 
    } 
 

 
    @Override 
 
    public void add(Object object) { 
 
     super.add(object); 
 
     sarasas.add(object); 
 
    } 
 

 
    @Override 
 
    public int getCount() { 
 
     return this.sarasas.size(); 
 
    } 
 

 

 
    @Override 
 
    public Object getItem(int position) { 
 
     return this.sarasas.get(position); 
 
    } 
 

 

 
    @Override 
 
    public View getView(int position, View convertView, ViewGroup parent) { 
 

 
     View v = convertView; 
 

 
     final Duomenys pavadinimas; 
 

 

 

 
     if (v == null){ 
 
      LayoutInflater inflater = (LayoutInflater) this.getContext() 
 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
 

 
      v = inflater.inflate(R.layout.listview_layout, parent, false); 
 

 
      pavadinimas = new Duomenys(); 
 
//I have missed some unnecessary text here, hope it doesn't change 
 
//contex a lot 
 

 

 

 
//So, crap starts here. Don't mind that pavadinimas after dots. 
 
//Basically it's written here similarly to MainActivity, but it 
 
//shows errors because assigning is different :(
 

 
//   (SQLiteOpenHelper assigning is below) 
 
pavadinimas.plus.setOnClickListener(new View.OnClickListener() { 
 
       @Override 
 
       public void onClick(View v) { 
 
        pavadinimas.db.addactivity(name, description, number); 
 
       } 
 
      }); 
 

 

 

 
      v.setTag(pavadinimas); 
 
     }else { 
 
      pavadinimas = (Duomenys) v.getTag(); 
 
     } 
 

 

 
     DataActivity perdavimas = (DataActivity) this.getItem(position); 
 
     pavadinimas.txt1.setText(perdavimas.getNamee()); 
 

 
     return v; 
 

 
    } 
 

 
    static class Duomenys{ 
 

 
     SQLiteDatabase sql; 
 
     
 
     //Here i don't know how to assign my SQLiteOpenHelper, 
 
     // so actually, I NEED HELP HERE 
 
     ActivitiesDataBase db; 
 
     
 
    } 
 
}

所以,我真的想知道,如何分配(如果可能)SQLiteOpenHelper在自定義適配器。任何幫助都是有好處的。

所以,這是我編輯的版本。一切都很好用靜態類Duomenys,但有一些下劃線在該部分:

@Override 
 
    public View getView(int position, View convertView, ViewGroup parent) { 
 

 
     View v = convertView; 
 

 
//Here it underlines mContext and i really don't know from where to get it 
 
     final Duomenys pavadinimas = new Duomenys(mContext); 
 

 
     if (v == null){ 
 
      LayoutInflater inflater = (LayoutInflater) this.getContext() 
 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
 

 
      v = inflater.inflate(R.layout.listview_layout, parent, false); 
 

 
//Then it underlines() after Duomenys 
 
      pavadinimas = new Duomenys(); 
 
pavadinimas.plus.setOnClickListener(new View.OnClickListener() { 
 
       @Override 
 
       public void onClick(View v) { 
 
       
 
pavadinimas.db.assactivity(name, description, number); 
 

 
       } 
 
      }); 
 

 
      v.setTag(pavadinimas); 
 
     }else { 
 
     
 
//And it underlines pavadinimas, saying 
 
//"Cannot assign a value to final variable 'pavadinimas' " 
 
      pavadinimas = (Duomenys) v.getTag(); 
 
     }

+0

我用Java標記換出了問題上的JavaScript標記。他們是兩種截然不同的語言。就這樣你知道:) –

+1

哦,我的上帝!順便說一句,謝謝 –

+0

,你是知道java的人,而不是javaScript,對不對? –

回答

0

創建Duomenys對象傳遞時添加構造函數Duomenys類

static class Duomenys{ 

     SQLiteDatabase sql; 

     //Here i don't know how to assign my SQLiteOpenHelper, 
     // so actually, I NEED HELP HERE 
     ActivitiesDataBase db; 
     public Duomenys(Context context){ 
      this.db = new ActivitiesDataBase(context); 
     } 

    } 

然後背景final Duomenys pavadinimas = new Duomenys(mContext)

+0

謝謝,現在我不能嘗試,將嘗試以後 –

+0

告知我,如果你曾嘗試 –

+0

是的,我會做它tomoorrow –

0

因此,與@AgiMaulana的幫助我解決了這個問題。代碼只有在CustomAdapter改變,所以在這裏它是:

@Override 
 
    public View getView(int position, View convertView, ViewGroup parent) { 
 

 
     View v = convertView; 
 

 
     final Duomenys pavadinimas; 
 

 
     if (v == null){ 
 
      LayoutInflater inflater = (LayoutInflater) this.getContext() 
 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
 

 
      v = inflater.inflate(R.layout.listview_layout, parent, false); 
 

 
      pavadinimas = new Duomenys(getContext()); 
 
      pavadinimas.plus.setOnClickListener(new View.OnClickListener() { 
 
       @Override 
 
       public void onClick(View v) { 
 
       
 
        pavadinimas.db.modifyNumber(name, newNumber); 
 
       } 
 
      }); 
 

 
     v.setTag(pavadinimas); 
 
     }else { 
 
      pavadinimas = (Duomenys) v.getTag(); 
 
     }

謝謝你們非常感謝!