0

좋은 아침,Sqlite - 자체 데이터베이스가있는 처리기, 어댑터 및 공급자?

나는 안드로이드 애플 리케이션을 개발하는 과정에 있는데, 내가 해결할 수없는 것을 발견했다. (검색은 그물에서 찾은 코드를 시도하거나 수정하는 데 도움이되지 않았다.) 제 특정한 경우에 도움이 필요하기 전에 여기에 답을 줄 수도 있습니다.

내 앱이 간단합니다 (시작 시간이 5 초임). 기본 활동 (FragmentActivity)으로 이동하는 것보다 간단합니다. 주요 활동에는 5 개의 다른 ListFragments가 있습니다 (지금은 목록에서 어떻게 보일지 알 수 있도록 임의의 텍스트를로드했습니다). 모든 프래그먼트에는 ListFragment를 채울 자체 데이터베이스가 있습니다 (하나의 데이터베이스가 완료되어 다른 데이터베이스를 만들기 전에 완료해야합니다).

1 데이터베이스에 대해 나는 어댑터, 처리기 및 공급자를 가지고 놀았지만 아무 것도 작동하지 않았습니다 (데이터베이스가있는 ListFragment는 로딩 원을 표시하고있었습니다).

그럼 자습서 "응용 프로그램에서 자체 데이터베이스 사용"을 찾았지만 도움이되지 못했습니다. (내 프로젝트에서 작동하도록 코드를 수정할 수 없음)

내가 필요로하는 모든

이 있습니다 :

SplashScreen로 동안
  • , 데이터베이스가 처음으로 (미래 이상의 데이터베이스에서)로드 장치에 저장해야합니다 (로 SplashScreen는 모든 시간을 표시한다 응용 프로그램이 시작하지만 처음에만 데이터베이스를로드 할 수 있습니다) -주의 사항이 가능한 경우 thou, 모든 경우에 스플래시 화면이 나타나기 때문에 데이터베이스가로드 될 때마다 표시되고 5 초는 5 DB에 충분합니다. 각 200bytes 그래서 아무 문제도 여기에서.
  • 의 주요 활동은 다음

지금까지 내 코드입니다 ... 그래서 두 번째 데이터베이스에서 데이터를 표시해야 다음 ListFragment로 보내 주시면 데이터베이스

  • 의 데이터로 첫 ListFragment를 표시합니다

    스플래시 스크린

    다음
    public class Splash extends Activity { 
    
        private boolean bIsBackButtonPressed; 
        private static final int SPLASH_DURATION = 5000; 
        private static final int FM_NOTIFICATION_ID = 0; 
    
        public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
    
         this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
         this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    
         NotificationCompat.Builder notification = new NotificationCompat.Builder(this) 
          .setSmallIcon(R.drawable.notification_icon) 
          .setContentTitle("Testing app in execution") 
          .setContentText("Click here to go back in the app"); 
    
         Intent notificationIntent = new Intent(this, Main.class); 
         notification.setOngoing(true); 
         PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
         notification.setContentIntent(contentIntent); 
    
         NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
         manager.notify(FM_NOTIFICATION_ID, notification.build()); 
    
    
         setContentView(R.layout.splash); 
    
         ImageView splashImage = (ImageView) findViewById(R.id.splash_screen_); 
    
         int orient = getWindowManager().getDefaultDisplay().getRotation(); 
         if (orient == 0) { 
          splashImage.setBackgroundResource(R.drawable.splash_screen_port); 
         } else { 
          splashImage.setBackgroundResource(R.drawable.splash_screen_land); 
    
         } 
    
         Handler handler = new Handler(); 
    
         handler.postDelayed(new Runnable() { 
    
          @Override 
          public void run() { 
    
           finish(); 
    
           if (!bIsBackButtonPressed) { 
            Intent intent = new Intent(Splash.this, Main.class); 
            Splash.this.startActivity(intent); 
           } 
          } 
         }, SPLASH_DURATION); 
        } 
    
        @Override 
        public void onConfigurationChanged(Configuration newConfig) { 
         super.onConfigurationChanged(newConfig); 
         ImageView splashImage = (ImageView) findViewById(R.id.splash_screen_); 
         int orient = getWindowManager().getDefaultDisplay().getRotation(); 
         if (orient == 0) { 
          splashImage.setBackgroundResource(R.drawable.splash_screen_port); 
         } else { 
          splashImage.setBackgroundResource(R.drawable.splash_screen_land); 
         } 
    
        } 
    
        @Override 
        public void onBackPressed() { 
         bIsBackButtonPressed = true; 
         finish(); 
         super.onBackPressed(); 
         NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
         manager.cancel(FM_NOTIFICATION_ID); 
        } 
    
    } 
    

    내 MainActivity

    입니다
    public class Main extends FragmentActivity { 
    
        SectionsPagerAdapter mSectionsPagerAdapter; 
        ViewPager mViewPager; 
    
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.main); 
    
         mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 
         mViewPager = (ViewPager) findViewById(R.id.pager); 
         mViewPager.setAdapter(mSectionsPagerAdapter); 
    
        } 
    
        public class SectionsPagerAdapter extends FragmentPagerAdapter { 
    
         public SectionsPagerAdapter(FragmentManager fm) { 
          super(fm); 
         } 
    
         @Override 
         public Fragment getItem(int position) { 
    
          Fragment fragment = new Fragment(); 
          switch (position) { 
          case 0: 
           return fragment = new 1List(); 
          case 1: 
           return fragment = new 2List(); 
          case 2: 
           return fragment = new 3List(); 
          case 3: 
           return fragment = new 4List(); 
          case 4: 
           return fragment = new 5List();    
          default: 
           break; 
          } 
          return fragment; 
         } 
    
         @Override 
         public int getCount() { 
    
          return 5; 
         } 
    
         @Override 
         public CharSequence getPageTitle(int position) { 
          switch (position) { 
          case 0: 
           return getString(R.string.1); 
          case 1: 
           return getString(R.string.2); 
          case 2: 
           return getString(R.string.3); 
          case 3: 
           return getString(R.string.4); 
          case 4: 
           return getString(R.string.5);    
    
          } 
    
          return null; 
         } 
        } 
    
        private static final int FM_NOTIFICATION_ID = 0; 
    
        @Override 
        public void onBackPressed() { 
         new AlertDialog.Builder(this) 
         .setMessage("Do you want to close the app?") 
         .setCancelable(false) 
         .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           Main.this.finish(); 
           NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
           manager.cancel(FM_NOTIFICATION_ID); 
          } 
         }) 
         .setNegativeButton("No", null) 
         .show(); 
        } 
    
    } 
    

    입니다 내 첫 번째 ListFragment (다른 4는 똑같은 내용이 - 이것은 자산 폴더에 저장됩니다 내 데이터베이스의 데이터로 채워되어야한다) : 나는이 언급 한 바와 같이

    public class 1List extends ListFragment { 
    
        @Override 
        public void onActivityCreated(Bundle savedInstanceState) { 
         super.onActivityCreated(savedInstanceState); 
         String[] values = new String[] { 
           "Android", "iPhone", "WindowsMobile", "Blackberry", "WebOS", "Ubuntu", "Windows7", "Mac OS X", "Linux", "OS/2" 
         }; 
         ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, values); 
         setListAdapter(adapter); 
        } 
    
    } 
    

    CursorAdapter 확장 어댑터 - 1ListDatabaseAdapter : 핸들러 1ListDatabaseHandler을

    public class 1ListDatabaseAdapter extends CursorAdapter { 
    
        private LayoutInflater inflater; 
        private int s; 
        String TAG = "1ListDatabaseAdapter"; 
    
        public 1ListDatabaseAdapter(Context context, Cursor c){ 
         super(context, c); 
         inflater = LayoutInflater.from(context); 
         s = c.getCount(); 
        } 
    
        @Override 
        public void bindView(View view, Context context, Cursor cursor) { 
    
         TextView name = (TextView) view.findViewById(R.id.name); 
    
    
         name.setText(cursor.getString(1)); 
    
         cursor.moveToNext(); 
    
        } 
    
        @Override 
        public View newView(Context arg0, Cursor arg1, ViewGroup arg2) { 
         return inflater.inflate(R.layout.list_item, null); 
        } 
    } 
    

    을 그리고 내가 가진 :

    public class 1ListDatabaseHandler extends SQLiteOpenHelper { 
    
        private static final String TAG = 1ListDatabaseHandler.class.getSimpleName(); 
    
        private static final String DATABASE_NAME = "1ldb.db"; 
        private static final int DATABASE_VERSION = 1; 
    
    
        public static final String ID = "_id"; 
        public static final String TABLE_NAME = "1list"; 
        public static final String NAME = "name"; 
        public static final String TYPE = "type"; 
        public static final String ADDRESS = "adress"; 
        public static final String PHONE = "phone"; 
        public static final String MAIL = "email"; 
        public static final String SITE = "website"; 
    
        private static final String TABLE_CREATE = " CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
          + NAME + " STRING, " + TYPE + " STRING, " + ADDRESS + " STRING, " + PHONE + " STRING, " + MAIL + " STRING, " + SITE + " STRING); "; 
    
        private static final String TABLE_DROP = "DROP TABLE IF EXISTS " + TABLE_NAME; 
    
        AlojamentoDatabaseHandler(Context context) { 
         super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    //  Log.i(TAG, "DatabaseHandler was initiated. "); 
        } 
    
        @Override 
        public void onCreate(SQLiteDatabase db) { 
         db.execSQL(TABLE_CREATE); 
         Log.i(TAG, "1ListDatabaseHandler: " + db); 
        } 
    
        @Override 
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
         Log.w(TAG, "Upgrading the database from version " + oldVersion + " to version " + newVersion); 
         db.execSQL(TABLE_DROP); 
         onCreate(db); 
        } 
    
        public void insert(String name, String type, String adress, String phone, String email, String website) { 
         long rowId = -1; 
         try { 
          SQLiteDatabase db = getWritableDatabase(); 
          ContentValues values = new ContentValues(); 
          values.put(NAME, name); 
          values.put(TYPE, type); 
          values.put(ADDRESS, adress); 
          values.put(PHONE, phone); 
          values.put(MAIL, email); 
          values.put(SITE, website); 
          rowId = db.insert(TABLE_NAME, null, values); 
          Log.i(TAG, "insert: " + name + ", " + type + ", " + adress + ", " + phone + ", " + email + ", " + website); 
         } catch (SQLiteException e) { 
          Log.i(TAG, "insert()", e); 
         } finally { 
          Log.i(TAG, "insert(): rowId=" + rowId); 
         } 
    
        } 
    
        public Cursor query() { 
         SQLiteDatabase db = getWritableDatabase(); 
         return db.query(TABLE_NAME, null, null, null, null, null, ID + " ASC"); 
        } 
    
    
    
    } 
    

    모든 가져 오기가 올바르게 이루어집니다. 응용 프로그램이 데이터베이스없이 (물론 시각적 인 경우) 실행되면 이제는 1ListFragment에 데이터를 표시하기 위해 sqlite 데이터베이스를 연결해야합니다. 질문은 여기에서) 나는 나의 자신에 계산하는 것을 시도하는 많은 연구를했다 (나가 일하는 까라고 일으키는 원인이된다 - 오오 그렇습니다!)하지만 항상 내 머리를 긁어 내고 나왔다. 많은 코드를 만들어 내고 적용 해 보았는데 아무런 효과가 없었다. 정말 간단하다고 생각한다. 나는 그것에 손가락을 넣을 수 없다. 내 premade 데이터베이스를 내 앱에 연결하고 1ListFragment에 데이터를 표시하려면 어떻게해야합니까?

    미리 감사드립니다. 당신은 당신이 당신의 adpater를 사용해야합니다 ArrayAdapter와를 사용하는

  • 답변

    0

    :
    이 함께 1List 클래스 드 코드를 바꿉니다 :

    public class 1List extends ListFragment { 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
        super.onActivityCreated(savedInstanceState); 
    
        1ListDatabaseHandler Db = new 1ListDatabaseHandler(getActivity()); 
        Cursor cursor = Db.query(); 
        if (cursor != null) { 
         cursor.moveToFirst(); 
        } 
        1ListDatabaseAdapter adapter = new 1ListDatabaseAdapter(getActivity(), cursor); 
        setListAdapter(adapter); 
    } 
    

    을 내가 보는 또 다른 한가지는 당신이 당신의 SQLiteOpenHelper class에 이름 1ListDatabaseHandler을주고 생성자의 이름입니다 AlojamentoDatabaseHandler.
    이 코드의 조각에 대한 1ListDatabaseAdapter

    +0

    덕분에 bindView에서 cursor.moveToNext();를 제거 1ListDatabaseHandler(Context context)
    AlojamentoDatabaseHandler(Context context)를 교체합니다. 위 코드를 사용하면 앱이 제대로 작동합니다. 내 장치에 저장 되었기 때문에 데이터베이스에 약간의 어려움이 있었으며 저장된 버전에는 "id"대신 "_id"가 포함 된 업데이트 된 버전이 포함되어 있지 않았습니다. 하지만 1ListFragment는 데이터베이스에서 아무 것도 표시하지 않습니다. 그래서 여기에, 응용 프로그램이 시작, 주요 활동로드, 데이터베이스가로드 된 (나는) 생각하지만 1ListFragment의 ListView는 데이터베이스에서 아무것도 표시하지 않습니다 (데이터베이스는 이미 모든 데이터를 포함하고 있습니다). 도와 주셔서 다시 한번 큰 감사드립니다. –

    +0

    데이터베이스의 데이터로 목록의 항목을 채우는 'bindView'에 있습니다. 지금까지 나는 단지 하나만 본다. 진행하기 전에 커서가 무엇을 반환하는지 먼저 확인해야합니다. id/_id 문제가 문제 일 수 있습니다. – ramaral

    +0

    모든 도움을 주셔서 감사합니다. 귀하가 저에게 준 적응증을 사용하여 제가 의도 한 바를 정확히 수행 할 수있었습니다. 내가 명성을 얻 자마자 나는 유용한 답을 표시 할 것이다. –