Ничего не нужно. Просто используйте nextset:
import pyodbc
db = pyodbc.connect ("")
q = db.cursor ()
q.execute ("""
SELECT TOP 5 * FROM INFORMATION_SCHEMA.TABLES
SELECT TOP 10 * FROM INFORMATION_SCHEMA.COLUMNS
""")
tables = q.fetchall ()
q.nextset ()
columns = q.fetchall ()
assert len (tables) == 5
assert len (columns) == 10
В настоящее время лучшей документацией является источник. Вы можете взглянуть на это здесь (attrs.xml) .
Вы можете определить атрибуты в верхнем элементе <resources>
или внутри элемента <declare-styleable>
. Если я собираюсь использовать attr более чем в одном месте, я помещаю его в корневой элемент. Обратите внимание, что все атрибуты имеют одно и то же глобальное пространство имен. Это означает, что даже если вы создадите новый атрибут внутри элемента <declare-styleable>
, его можно будет использовать вне его, и вы не сможете создать другой атрибут с тем же именем другого типа.
Элемент <attr>
имеет два атрибута xml name
и format
. name
позволяет вам называть это чем-то, и именно так вы в конечном итоге ссылаетесь на это в коде, например, R.attr.my_attribute
. Атрибут format
может иметь разные значения в зависимости от типа атрибута, который вы хотите.
Вы можете установить формат для нескольких типов, используя |
, например, format="reference|color"
.
enum
могут быть определены следующим образом: атрибуты
<attr name="my_enum_attr">
<enum name="value1" value="1" />
<enum name="value2" value="2" />
</attr>
flag
похожи, за исключением того, что необходимо определить значения, чтобы их можно было объединить в биты:
<attr name="my_flag_attr">
<flag name="fuzzy" value="0x01" />
<flag name="cold" value="0x02" />
</attr>
В дополнение к атрибутам есть элемент <declare-styleable>
. Это позволяет вам определять атрибуты, которые может использовать пользовательский вид. Вы делаете это, указывая элемент <attr>
, если он был определен ранее, вы не указываете format
. Если вы хотите повторно использовать атрибут Android, например, Android: gravity, то вы можете сделать это в name
следующим образом.
Пример настраиваемого представления <declare-styleable>
:
<declare-styleable name="MyCustomView">
<attr name="my_custom_attribute" />
<attr name="android:gravity" />
</declare-styleable>
При определении пользовательских атрибутов в XML для настраиваемого представления необходимо выполнить несколько действий. Сначала вы должны объявить пространство имен, чтобы найти ваши атрибуты. Вы делаете это с корневым элементом макета. Обычно есть только xmlns:android="http://schemas.android.com/apk/res/android"
. Теперь вы также должны добавить xmlns:whatever="http://schemas.android.com/apk/res-auto"
.
Пример:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:whatever="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<org.example.mypackage.MyCustomView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
whatever:my_custom_attribute="Hello, world!" />
</LinearLayout>
Наконец, для доступа к этому пользовательскому атрибуту вы обычно делаете это в конструкторе вашего пользовательского представления следующим образом.
public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView, defStyle, 0);
String str = a.getString(R.styleable.MyCustomView_my_custom_attribute);
//do something with str
a.recycle();
}
Конец. :) [Тысяча сто сорок семь]
если Вы опускаете эти format
атрибут от attr
элемент, можно использовать его для ссылки на класс от разметок XML.
Refactor > Rename
работы литий> <литий> Find Usages
, работы литий> <литий> и так далее... литий> ул.> не указывают format
атрибут в [1 119] .../src/main/res/values/attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyCustomView">
....
<attr name="give_me_a_class"/>
....
</declare-styleable>
</resources>
использование это в некотором файле расположения, .../src/main/res/layout/activity__main_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<SomeLayout
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- make sure to use $ dollar signs for nested classes -->
<MyCustomView
app:give_me_a_class="class.type.name.Outer$Nested/>
<MyCustomView
app:give_me_a_class="class.type.name.AnotherClass/>
</SomeLayout>
анализирует класс в Вашем коде инициализации представления .../src/main/java/.../MyCustomView.kt
class MyCustomView(
context:Context,
attrs:AttributeSet)
:View(context,attrs)
{
// parse XML attributes
....
private val giveMeAClass:SomeCustomInterface
init
{
context.theme.obtainStyledAttributes(attrs,R.styleable.ColorPreference,0,0).apply()
{
try
{
// very important to use the class loader from the passed-in context
giveMeAClass = context::class.java.classLoader!!
.loadClass(getString(R.styleable.MyCustomView_give_me_a_class))
.newInstance() // instantiate using 0-args constructor
.let {it as SomeCustomInterface}
}
finally
{
recycle()
}
}
}