Урок 101. Создаем свой ContentProvider

Обсуждение уроков
Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 101. Создаем свой ContentProvider

Сообщение trew » 03 окт 2013, 12:13

Вебинар 2. Базы данных. ContentProvider-ы
http://www.youtube.com/watch?v=8rxH759rwP4

Удивился, что в уроке не было ссылки на видео.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 101. Создаем свой ContentProvider

Сообщение Foenix » 03 окт 2013, 12:39

ну потому что это видео не имеет отношения к уроку, урок был написан задолго до того, как мы записали видео.
Обсудить видео можно тут viewtopic.php?f=60&t=2596
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

elexia
Сообщения: 1
Зарегистрирован: 17 дек 2013, 13:55
Откуда: Петрозаводск
Контактная информация:

Re: Урок 101. Создаем свой ContentProvider

Сообщение elexia » 17 дек 2013, 13:59

А существуют ли какие-нибудь условия использования ContentProvider? Что-то вроде, если данные используются только в пределах приложения, что достаточно использовать Adapter.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 101. Создаем свой ContentProvider

Сообщение Foenix » 17 дек 2013, 15:33

Первая ссылка в гугле
http://developer.android.com/guide/topi ... iders.html
третий абзац

You don't need to develop your own provider if you don't intend to share your data with other applications. However, you do need your own provider to provide custom search suggestions in your own application. You also need your own provider if you want to copy and paste complex data or files from your application to other applications.

Однако, информация устарела "немного". Посему - его будет правильно использовать почти везде (за исключением каких-то крошечных, демонстрационных задачек)
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Урок 101. Создаем свой ContentProvider

Сообщение alexmx » 10 мар 2014, 18:01

Доброго времени суток)
Пытаюсь написать контент провайдер по вашему уроку но с двумя таблицами.
И тормознул на методе query.
Начал писать так:

Код: Выделить всё

 public Cursor query(Uri uri, String[] projection, String selection,
		      String[] selectionArgs, String sortOrder) {
		  // проверяем Uri
		  switch (uriMatcher.match(uri)) {
		  case URI_CATALOG:
			  // если сортировка не указана, ставим свою - по имени
		      if (TextUtils.isEmpty(sortOrder)) {
		        sortOrder = CATALOG_NAME + " ASC";
		      }
		      break;
		  case URI_CATALOG_ID:
			  String id = uri.getLastPathSegment();
		      // добавляем ID к условию выборки
		      if (TextUtils.isEmpty(selection)) {
		        selection = CATALOG_ID + " = " + id;
		      } else {
		        selection = selection + " AND " + CATALOG_ID + " = " + id;
		      }
		      break;
		  case URI_DATA:
			  if (TextUtils.isEmpty(sortOrder)){
				  sortOrder = DATA_NAME + " ASC";
			  }
			  break;
		  case URI_DATA_ID:
			  String dataid = uri.getLastPathSegment();
		      // добавляем ID к условию выборки
		      if (TextUtils.isEmpty(selection)) {
		        selection = DATA_ID + " = " + id;
		      } else {
		        selection = selection + " AND " + DATA_ID + " = " + id;
		      }
		      break;
		  		default:
		  			throw new IllegalArgumentException("Wrong URI: " + uri);
		  			
		  }
		 
		  
		  
		  
	  }
Меня интересует как теперь сформировать запрос на разные таблицы???

Заранее благодарю

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 101. Создаем свой ContentProvider

Сообщение Foenix » 10 мар 2014, 18:29

погоди, ты вначале на одной таблице потренируйся. У тебя недореализован пока что этот метод. Ты формируешь selection и sortorder, а сам запрос нет. Когда реализуешь его, то, наверное, поймешь как делать запрос на другие таблицы.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Урок 101. Создаем свой ContentProvider

Сообщение alexmx » 10 мар 2014, 18:34

Ну по сути я в принципе понял как это сделать нужно объявить переменную типа string и присвоить значение имени таблицы, а в запрос вставить уже переменную.

Правильно?

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Урок 101. Создаем свой ContentProvider

Сообщение alexmx » 10 мар 2014, 18:42

Код: Выделить всё

String tn = null;
...
tn = DATA_NAME;
...
 Cursor cursor = db.query(tn, projection, selection,
        selectionArgs, null, null, sortOrder);
Примерно так понимаю.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 101. Создаем свой ContentProvider

Сообщение Foenix » 10 мар 2014, 20:29

зачем лишние переменные? первым параметром пиши свою data_name. Адля того, чтоб к другой таблице сделать запрос - пиши другую таблицу.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Урок 101. Создаем свой ContentProvider

Сообщение alexmx » 11 мар 2014, 16:33

Что то я Вас не совсем понял, как это будет выглядеть "другая таблица"?

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Урок 101. Создаем свой ContentProvider

Сообщение alexmx » 11 мар 2014, 16:57

Примерно так???
[syntax=java] db = dbHelper.getWritableDatabase();
Cursor cursor = db.query(CATALOG_TABLE, projection, selection,
selectionArgs, null, null, sortOrder);

db = dbHelper.getWritableDatabase();
cursor = db.query(DATA_TABLE, projection, selection,
selectionArgs, null, null, sortOrder);

cursor.setNotificationUri(getContext().getContentResolver(),
CATALOG_CONTENT_URI);
return cursor;
cursor.setNotificationUri(getContext().getContentResolver(),
DATA_CONTENT_URI);

return cursor;[/syntax]

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 101. Создаем свой ContentProvider

Сообщение Foenix » 11 мар 2014, 19:23

нет.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Урок 101. Создаем свой ContentProvider

Сообщение alexmx » 11 мар 2014, 19:48

Ткните пожалуйста носом))) что не так?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 101. Создаем свой ContentProvider

Сообщение Foenix » 11 мар 2014, 20:59

в каждый отдельно предназначенный для запроса пункт в операторе CASE после соответствующей метки нужно добавить вызов самого запроса, с параметрами .
а нотификацию посылать уже после оператора CASE и последний оператор RETURN так как у вас

Код: Выделить всё

cursor.setNotificationUri(getContext().getContentResolver(),

                            DATA_CONTENT_URI);
                    return cursor;
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
alexmx
Сообщения: 193
Зарегистрирован: 10 мар 2014, 08:14

Re: Урок 101. Создаем свой ContentProvider

Сообщение alexmx » 13 мар 2014, 19:26

Спасибо Вам)) Буду следующий метод разбирать.

Аватара пользователя
Татьяна
Сообщения: 4
Зарегистрирован: 20 апр 2014, 08:36

Re: Урок 101. Создаем свой ContentProvider

Сообщение Татьяна » 30 апр 2014, 15:10

Простите, но не понимаю... в ContentProvider мы создаем БД? а если БД есть (создана в одной Activity по 34-му уроку), как обращаться к ней из другой Activity?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 101. Создаем свой ContentProvider

Сообщение Foenix » 30 апр 2014, 15:52

CP- это способ доступа к БД. Обращаться с его помощью к БД можно из любой активити одинаково, не важно где она была создана.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

allexan
Сообщения: 23
Зарегистрирован: 03 июл 2014, 16:32

Re: Урок 101. Создаем свой ContentProvider

Сообщение allexan » 07 авг 2014, 15:37

Решил попробовать ContentProvider.
Для начала только упрощенный вариант: создать базу и посмотреть, что создалось

Провайдер:

Код: Выделить всё

package alex.com.example.p_content_provider;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.util.Log;

public class MyProvider extends ContentProvider {
	
	final String LOG_TAG = "myLogs";
	SQLiteDatabase db;

	public int delete(Uri arg0, String arg1, String[] arg2) {
		// TODO Auto-generated method stub
		return 0;
	}

	public String getType(Uri arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	public Uri insert(Uri arg0, ContentValues arg1) {
		// TODO Auto-generated method stub
		return null;
	}

	public boolean onCreate() {
		// TODO Auto-generated method stub
		Log.d(LOG_TAG, "--- onCreate ---");
		DBHelper dbH = new DBHelper(getContext());
		SQLiteDatabase db = dbH.getWritableDatabase(); 
		return false;
	}

	public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
			String arg4) {
		// TODO Auto-generated method stub
		Log.d(LOG_TAG, "--- query ---");
		Cursor c = db.query("my_table", null, null, null, null, null, null);
		return c;
	}

	public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
		// TODO Auto-generated method stub
		return 0;
	}
	//=====================================================================
	class DBHelper extends SQLiteOpenHelper {

        public DBHelper(Context context) {
          // конструктор суперкласса
          super(context, "MyDB", null, 1);
        }

        public void onCreate(SQLiteDatabase db) {
          // создаем таблицу с полями
          db.execSQL("create table my_table ("
              + "_id integer primary key autoincrement," 
              + "field1 text,"
              + "field2 text,"
              + "field3 text" + ");");
          
          ContentValues cv = new ContentValues();
          cv.put("field1", "1");
          cv.put("field2", "11");
          cv.put("field3", "111");
          // вставляем запись и получаем ее ID
          long rowID = db.insert("my_table", null, cv);
          cv.put("field1", "2");
          cv.put("field2", "22");
          cv.put("field3", "222");
          // вставляем запись и получаем ее ID
          rowID = db.insert("my_table", null, cv);
         
          Log.d(LOG_TAG, "--- NEW ---");

        }

    
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
      }
	
	//=====================================================================
	

}
MainActivity:

Код: Выделить всё

package alex.com.example.p_content_provider;

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity {

	final String LOG_TAG = "myLogs";
	
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Log.d(LOG_TAG, "--- app start---");
        
        final Uri CONTACT_URI = Uri.parse("content://alex.com.example");
        Cursor c = getContentResolver().query(CONTACT_URI, null, null,null, null);
        
        Log.d(LOG_TAG, "--- get cursor ---");
    }
}
База создалась, но посмотреть ее не удалось

Вот логи:

Код: Выделить всё

08-07 12:10:29.870: D/myLogs(25782): --- NEW ---
08-07 12:10:29.960: D/myLogs(25782): --- app start---
08-07 12:10:29.960: D/myLogs(25782): --- query ---
08-07 12:10:29.960: D/AndroidRuntime(25782): Shutting down VM
08-07 12:10:29.960: W/dalvikvm(25782): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
08-07 12:10:29.980: E/AndroidRuntime(25782): FATAL EXCEPTION: main

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 101. Создаем свой ContentProvider

Сообщение KamiSempai » 07 авг 2014, 16:25

Логи не полные.
Учитесь читать логи viewtopic.php?f=60&t=3198
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

allexan
Сообщения: 23
Зарегистрирован: 03 июл 2014, 16:32

Re: Урок 101. Создаем свой ContentProvider

Сообщение allexan » 08 авг 2014, 07:52

Вот полные логи:

Код: Выделить всё

08-08 04:45:47.006: D/myLogs(769): --- onCreate ---
08-08 04:45:47.126: D/myLogs(769): --- NEW ---
08-08 04:45:47.236: D/myLogs(769): --- app start---
08-08 04:45:47.236: D/myLogs(769): --- query ---
08-08 04:45:47.246: D/AndroidRuntime(769): Shutting down VM
08-08 04:45:47.246: W/dalvikvm(769): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
08-08 04:45:47.255: E/AndroidRuntime(769): FATAL EXCEPTION: main
08-08 04:45:47.255: E/AndroidRuntime(769): java.lang.RuntimeException: Unable to start activity ComponentInfo{alex.com.example.p_content_provider/alex.com.example.p_content_provider.MainActivity}: java.lang.NullPointerException
08-08 04:45:47.255: E/AndroidRuntime(769): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at android.app.ActivityThread.access$600(ActivityThread.java:122)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at android.os.Handler.dispatchMessage(Handler.java:99)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at android.os.Looper.loop(Looper.java:137)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at android.app.ActivityThread.main(ActivityThread.java:4340)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at java.lang.reflect.Method.invokeNative(Native Method)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at java.lang.reflect.Method.invoke(Method.java:511)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at dalvik.system.NativeStart.main(Native Method)
08-08 04:45:47.255: E/AndroidRuntime(769): Caused by: java.lang.NullPointerException
08-08 04:45:47.255: E/AndroidRuntime(769): 	at alex.com.example.p_content_provider.MyProvider.query(MyProvider.java:47)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at android.content.ContentProvider$Transport.query(ContentProvider.java:178)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at android.content.ContentResolver.query(ContentResolver.java:310)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at alex.com.example.p_content_provider.MainActivity.onCreate(MainActivity.java:22)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at android.app.Activity.performCreate(Activity.java:4465)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
08-08 04:45:47.255: E/AndroidRuntime(769): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
08-08 04:45:47.255: E/AndroidRuntime(769): 	... 11 more

Ответить